Zu Protokollierungszwecken möchte ich den vollständig qualifizierten Klassennamen eines Python-Objekts abrufen. (Mit voll qualifiziert meine ich den Klassennamen einschließlich des Paket- und Modulnamens.)
Ich weiß Bescheid x.__class__.__name__
, aber gibt es eine einfache Methode, um das Paket und das Modul zu erhalten?
python
python-datamodel
Hanno S.
quelle
quelle
o.__class__.__module__
jemals anders also.__module__
?".".join([o.__module__, o.__name__])
für Python3AttributeError: 'AttributeError' object has no attribute '__module__'
Die angegebenen Antworten beziehen sich nicht auf verschachtelte Klassen. Obwohl es erst in Python 3.3 ( PEP 3155 ) verfügbar ist , möchten Sie
__qualname__
die Klasse wirklich verwenden . Eventuell (3.4? PEP 395 )__qualname__
wird es auch für Module geben, um Fälle zu behandeln, in denen das Modul umbenannt wird (dh wenn es umbenannt wird__main__
).quelle
Type.__module__ + '.' + Type.__qualname__
.__qualname__
immer noch nur der Klassenname aufgelöstErwägen Sie die Verwendung eines
inspect
Moduls mit Funktionen, nachgetmodule
denen möglicherweise gesucht wird:quelle
inspect.getmodule()
Gibt Modulobjekte zurück - nicht vollständig qualifizierte Klassennamen. Tatsächlich bietet dasinspect
Modul keinerlei Funktionen, die diese Frage tatsächlich beantworten würden. Diese Antwort ist keine Antwort.</facepalm>
Hier ist eine, die auf Greg Bacons ausgezeichneter Antwort basiert, aber mit ein paar zusätzlichen Überprüfungen:
__module__
kann seinNone
(laut den Dokumenten), und auch für einen Typ wiestr
es sein kann__builtin__
(den Sie möglicherweise nicht in Protokollen oder was auch immer erscheinen möchten). Die folgenden Überprüfungen für beide Möglichkeiten:(Es gibt möglicherweise eine bessere Möglichkeit, dies zu überprüfen
__builtin__
. Das oben Gesagte beruht lediglich auf der Tatsache, dass str immer verfügbar ist und sein Modul immer verfügbar ist.__builtin__
)quelle
Für Python3.7 verwende ich:
Bekommen:
quelle
obj
dies eher eine Klasse als eine Objektinstanz sein muss.__module__
würde den Trick machen.Versuchen:
Diese Site schlägt vor, dass dies
__package__
für Python 3.0 funktionieren könnte. Die dort angegebenen Beispiele funktionieren jedoch nicht unter meiner Python 2.5.2-Konsole.quelle
"%s.%s" % (x.__class__.__module__, x.__class__.__name__)
Dies ist ein Hack, aber ich unterstütze 2.6 und brauche nur etwas Einfaches:
quelle
__repr__()
Implementierung in der geprüften Klasse ( und auf__str__()
nicht in den überschriebenen). In den meisten Fällen nutzlos.Einige Leute (z. B. https://stackoverflow.com/a/16763814/5766934 ) argumentieren, dass dies
__qualname__
besser ist als__name__
. Hier ist ein Beispiel, das den Unterschied zeigt:Beachten Sie, dass es auch für Buildins korrekt funktioniert:
quelle
Da das Interesse dieses Themas darin besteht, vollständig qualifizierte Namen zu erhalten, tritt hier eine Gefahr auf, wenn relative Importe zusammen mit dem im selben Paket vorhandenen Hauptmodul verwendet werden. ZB mit dem folgenden Modul-Setup:
Hier ist die Ausgabe, die das Ergebnis des unterschiedlichen Imports desselben Moduls zeigt:
Wenn Brummen Balken unter Verwendung des relativen Pfads importiert, sieht Balken
Baz.__module__
nur "baz", aber beim zweiten Import, der den vollständigen Namen verwendet, sieht Balken dasselbe wie "foo.baz".Wenn Sie die vollständig qualifizierten Namen irgendwo beibehalten, ist es besser, relative Importe für diese Klassen zu vermeiden.
quelle
Keine der Antworten hier hat bei mir funktioniert. In meinem Fall verwendete ich Python 2.7 und wusste, dass ich nur mit Newstyle-
object
Klassen arbeiten würde.quelle