Frage zu codecs.register_error

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
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Die Registrierung eines Decode/Encode-Errorhandlers für String-Encodings wird ja so erstellt:

Code: Alles auswählen

def handler(exceptionobject):
    # do something with the error
codecs.register_error('my_error_handler', handler)
und im weiteren Verlauf über den String-Bezeichner referenziert, z.B:

Code: Alles auswählen

'superduperstring'.decode('utf-8', 'my_error_handler')
# oder
u'unicode ist toll'.encode('utf-8', 'my_error_handler')
Meine Frage ist nun, ob Registrierung und Identifizierung des Errorhandler über den String interpreter-global ist oder nicht.
Hintergrund ist der Umstand, dass ich eine Objektmethode als Errorhandler nutze, welche selbst ein anderes Objektattribut nutzt, was bei weiteren erstellten Objekten zu Problemen führen könnte, Beispiel:

Code: Alles auswählen

class Foo(object):
    def __init__(self):
        self.attribtX = 'whatever'
        codecs.register_error('my_error_handler', self.handler)
    def handler(self,exception):
        # errorhandling with self.attribX
f1 = Foo() # hier ist noch alles gut
f2 = Foo() # hier mappen alle Errors von f1 auf den Handler von f2, falls interpreter-global
Falls der Zugriff über den String interpreterglobal ist, kann man das Problem durch ändern des Strings während der Objekt-Erstellung beheben. Nur weiss ich nicht, ob das überhaupt der Fall ist.

Edit:
Im Übrigen wird decode('encoding', 'my_error_handler') selbst nur innerhalb einer anderen Methode des Objektes genutzt. Daher reduziert sich evtl. das Problem auf die Frage, ob bei erneutem Durchlauf von decode('encoding', 'my_error_string') in f1 der String für den Handler neu ausgewertet wird (was nach Erzeugung von f2 dann auf den "falschen" Errorhandler zeigen würde).
Antworten