Zuordnung externer Namen zu einem internen Format

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
Redprince
User
Beiträge: 128
Registriert: Freitag 22. Oktober 2004, 09:22
Wohnort: Salzgitter
Kontaktdaten:

Guten Abend!

Ich habe bei einem aktuellen Projekt den Fall, dass ich aus verschiedenen externen Formaten lese, wobei die Bezeichner für die selben Informationen verschieden sind. Ich möchte nun besonders elegant in den Parser-Objekten die Zuordnung der jeweiligen Bezeichner zum internen Format vornehmen. Mein Ansatz ist nun, das interne Objekt wie folgt aufzubauen:

Code: Alles auswählen

class Intern(dict):
    FOO, BAR = "var_a", "var_b"
    
    def __init__(self):
        self.var_a = True
        self.var_b = False
        return
    
    def __setitem__(self, item, value):
        self.__setattr__(item, value)
        return
    
test = Intern()
test[Test.FOO] = "New Value"
Dies würde nun ermöglichen, in den Parser-Objekten entsprechend so vorzugehen:

Code: Alles auswählen

class Parser(object):
    SECTIONS = {"extern_a": Intern.FOO, "extern_b": Intern.BAR}
    
    def read(self):
        store = Intern()
        for extern, intern in Parser.SECTIONS.iteritems():
            data = extern.upper() # Auslesen der Informationen etc. pp.
            store[intern] = data
Somit wäre es möglich, für jeden Parser eine Zuordnung als Dictionary zu hinterlegen, und wenn man über die Bereiche iteriert und Informationen ausliest, simpel darauf zuzugreifen. Es würde natürlich die Möglichkeit bestehen, direkt auf Intern.__setattr__ zuzugreifen:

Code: Alles auswählen

class Parser(object):
    SECTIONS = {"extern_a": Intern.FOO, "extern_b": Intern.BAR}
    
    def read(self):
        store = Intern()
        for extern, intern in Parser.SECTIONS.iteritems():
            data = extern.upper() # Auslesen der Informationen etc. pp.
            store.__setattr__(intern, data)
Entsprechend würde Intern.__setitem__ entfallen. Ist dieses Vorgehen eurer Meinung nach so lesbar, pythonisch und sinnvoll? Wie würdet ihr das lösen, oder welche meiner Varianten würdet ihr bevorzugen?

Vielen Dank im voraus!
I am not part of the allesburner. I am the [url=http://allesburner.de]allesburner[/url].
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Wenn du das Teil schon von einem dict erben lässt, dann verwende es auch als ein solches.

Was auf jeden Fall ziemlich unpythonisch ist, dass du __setattr__ direkt aufrufst. __irgendwas__ sind besondere Attribute auf die man im Normalfall nicht zugreifen sollte. Nimm lieber die Funktion setattr die tut dasselbe.
Redprince
User
Beiträge: 128
Registriert: Freitag 22. Oktober 2004, 09:22
Wohnort: Salzgitter
Kontaktdaten:

Ich habe nur hilfsweise von dict erben lassen, damit __setitem__ funktioniert, was beim Erben von object entsprechend fehlt. Ich bin ansonsten auch für andere Möglichkeiten aufgeschlossen - mir ist einfach bloß nichts anderes eingefallen, um diese Zuordnung anständig zu gestalten; mein Ergebnis jedoch kam mir etwas merkwürdig vor..
I am not part of the allesburner. I am the [url=http://allesburner.de]allesburner[/url].
BlackJack

@Redprince: Wenn es direkt mit `setattr()` geht, würde ich das auch nehmen. Warum unnötig verkomplizieren? Womit sich die Frage stellt, ob `Intern.FOO` und `Intern.BAR` nötig sind? Das ist ja auch noch einmal eine Indirektion.

Edit: Was heisst weil `__setitem__()` bei `object` fehlt? Das ist doch völlig egal wenn Du das in Deiner Klasse implementierst.
Redprince
User
Beiträge: 128
Registriert: Freitag 22. Oktober 2004, 09:22
Wohnort: Salzgitter
Kontaktdaten:

Ah, vielen Dank!

Dass ich __setitem__ implementieren kann, ohne von dict zu erben, hatte ich schlicht ausgeblendet. Aus irgendeinem abstrakten Grund hielt ich die zusätzliche Indirektion innerhalb des internen Objektes für sinnvoll, aber das ist tatsächlich gar nicht notwendig, da die Variablen ohnehin aussagekräftig gewählt werden. Ich werde also nicht mehr von dict erben und mich mit einer Zuordnung in den Parsern begnügen!
I am not part of the allesburner. I am the [url=http://allesburner.de]allesburner[/url].
Antworten