Modulname ermitteln...

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
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

ich stehe vor folgendem Rätsel:

In einem Modul liegen zwei Klassen:

Code: Alles auswählen

class Appointment(object):
    ...

class Notes(object):
    ...

class Diary(object):
    ...
    def add_entries(entries):
        for entry_type in entries:
            obj = getattr(??Modulname??, entry_type)
            for values in entries(entry_type):
                self._entries.append(obj(**values))
Der Parameter 'entries', den ich an 'Diary.add_entries' übergebe sieht so aus:

Code: Alles auswählen

{
'Appointment':[{'begin':'201105240943', 'title':'blabla'}], 
'Notes':[{'title':'täterä','text':'rplgrmpf'}]
}
Wie erhalte ich nun den Modulnamen, um 'obj' erstellen zu können, also quasi das 'module-self'?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
deets

Du willst da nicht den Modulnamen (den du mit __name__ bekaemst), sondern globals()[klassen_name]. Das sollte gehen.

Besser aber waere es durch zB eine Metaklasse oder ein traversieren der __subclasses__() einer gemeinsamen Oberklasse einfach alle moeglichen Klassen & ihre Namen zu ermitteln. Dann bist du nicht auf ein Modul beschraenkt.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Du meinst also sowas:

Code: Alles auswählen

class Data(object):
    pass

class Appointment(Data):
    ...

class Notes(Data):
    ...

class Diary(object):
    ...
    def add_entries(self, entries):
        for entry_type in Data.__subclasses__():
            for values in entries.get(entry_type.__name__, ()):
                self._entries.append(entry_type(**values))
Wie meinst Du das, dass ich im Gegensatz zu 'globals()' mit '__subclasses__()' nicht auf ein Modul beschränkt bin?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
deets

Naja, mit subclasses bekommst du *alle* Unterklassen, auch welche aus anderen Modulen. globals() ist nur der modul-Namensraum.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Oh Mann, das ist jetzt richtig cool... über sowas kann ich mich den ganzen Tag freuen... :)

Vielen Dank!
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
lunar

@mutetella: Was spricht denn gegen eine explizite Abbildung des Namens auf das Klassenobjekt, beispielsweise durch ein Wörterbuch?

Das ist zwar länger, und nicht so „cool“, dafür weniger magisch, so dass Du auch in sechs Monaten noch verstehst, was Du da implementiert hast.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@lunar:
Meinst Du so:

Code: Alles auswählen

ENTRY_TYPES = {'Appointment':Appointment, 'Notes':Notes}
class Diary(object):
    ...
    def add_entries(self, entries):
        for entry_type in ENTRY_TYPES:
            for values in entries.get(entry_type, ()):
                self._entries.append(ENTRY_TYPES[entry_type](**values))
??

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten