Seite 1 von 1

Liste aller codecs, wie erhalten???

Verfasst: Montag 16. Januar 2006, 17:23
von jens
Hab diesen Weg mir ausgedacht, aber es muß doch wohl auch einfacher gehen, oder???

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: UTF-8 -*-

def get_codecs():
    from encodings import aliases
    codecs = aliases.aliases.values()
    temp = {}
    for item in codecs:
        temp[item] = None

    codecs = temp.keys()
    codecs.sort()
    return codecs

print get_codecs()

Verfasst: Montag 16. Januar 2006, 22:21
von BlackJack
Kommt drauf an was Du unter "alle codecs" verstehst, denn eigentlich ist das unmöglich. Codecs werden über `codecs.register()` bekannt gemacht. Damit registriert man aber keine Codecs sondern eine Funktion die einen Codec-Namen bekommt und dann eine Reihe von Funktionen zurückgibt wenn der Name bekannt ist.

Wenn Du alle codecs haben willst, musst Du also alle möglichen Buchstabenkombinationen darauf testen ob das vielleicht ein Codec-Name ist.

Verfasst: Dienstag 17. Januar 2006, 07:33
von jens
Naja, ich glaube mit den Aliases fahre ich schon ganz gut:
http://svn.python.org/view/python/trunk ... iew=markup

Ich nutzte extra nicht die Keys sondern nur die values, damit die Liste nicht unnötig lang ist, obwohl man damit schön prahlen kann :?

Und du meinst das ich damit nicht alle codecs habe?

Verfasst: Mittwoch 18. Januar 2006, 01:15
von BlackJack
Ich weiss nicht ob Du alle Codecs hast. Und wie gesagt, man kann das nicht so einfach herausfinden. Man kann problemlos zur Laufzeit weitere Codecs hinzufügen und das macht man mit einer "Suchfunktion" die einen Codec-Namen bekommt und dann entweder die entsprechenden (En)Decoder und Reader und Writer Objekte zurückgibt oder `None`.

Kleines pathologisches Beispiel:

Code: Alles auswählen

In [9]:def mycodecs(name):
   .9.:  if name.startswith('spam'):
   .9.:    return (None, None, None, None)
   .9.:

In [10]:codecs.register(mycodecs)

In [11]:codecs.lookup('foo')
---------------------------------------------------------------------------
exceptions.LookupError                               Traceback (most recent call last)

/home/bj/<ipython console>

LookupError: unknown encoding: foo

In [12]:codecs.lookup('spam_abc')
Out[12]:(None, None, None, None)

In [13]:codecs.lookup('spam_42')
Out[13]:(None, None, None, None)
Statt des Tupels müsste man natürlich die entsprechenden Objekte zurückgeben. Aber man sieht, das es jetzt unendlich viele Codecs gibt, deren Name mit 'spam' beginnt.

Ist ein blödes Beispiel, aber man könnte sich zum Beispiel einen 'rot13' Codec implementieren der nicht nur 13 sondern auch andere Verschiebungen erlaubt und sich die Zahl aus dem Namen holt.

Verfasst: Mittwoch 18. Januar 2006, 07:21
von jens
BlackJack hat geschrieben:Ich weiss nicht ob Du alle Codecs hast. Und wie gesagt, man kann das nicht so einfach herausfinden. Man kann problemlos zur Laufzeit weitere Codecs hinzufügen
Naja, gut... Aber das ist in meinem Falle bestimmt nicht so :) Ansonsten müßte PyLucid selber codecs hinzufügen und da wüsste ich von ;)

Alle Codecs die in /Lib/encodings/ liegen müßte ich doch schon haben, oder? Ansonsten könnte ich natürlich hingehen un gezielt in diesem Verzeichniss nach den Dateien suchen. Das dumme ist nur, das da ein paar "nicht codecs" rumliegen und außerdem der Aufwand zu groß ist...