Liste aller codecs, wie erhalten???

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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()

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten