Seite 1 von 1

Modulname ermitteln...

Verfasst: Dienstag 24. Mai 2011, 09:41
von mutetella
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

Re: Modulname ermitteln...

Verfasst: Dienstag 24. Mai 2011, 09:50
von 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.

Re: Modulname ermitteln...

Verfasst: Dienstag 24. Mai 2011, 10:30
von mutetella
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

Re: Modulname ermitteln...

Verfasst: Dienstag 24. Mai 2011, 10:44
von deets
Naja, mit subclasses bekommst du *alle* Unterklassen, auch welche aus anderen Modulen. globals() ist nur der modul-Namensraum.

Re: Modulname ermitteln...

Verfasst: Dienstag 24. Mai 2011, 10:48
von mutetella
Oh Mann, das ist jetzt richtig cool... über sowas kann ich mich den ganzen Tag freuen... :)

Vielen Dank!

Re: Modulname ermitteln...

Verfasst: Dienstag 24. Mai 2011, 11:13
von 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.

Re: Modulname ermitteln...

Verfasst: Dienstag 24. Mai 2011, 11:39
von mutetella
@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

Re: Modulname ermitteln...

Verfasst: Dienstag 24. Mai 2011, 11:42
von lunar
@mutetella: Ja.