Do celów rejestrowania chcę pobrać w pełni kwalifikowaną nazwę klasy obiektu Pythona. (W pełni kwalifikowane mam na myśli nazwę klasy, w tym nazwę pakietu i modułu).
Wiem o tym x.__class__.__name__
, ale czy istnieje prosty sposób na pobranie pakietu i modułu?
python
python-datamodel
Hanno S.
źródło
źródło
o.__class__.__module__
kiedykolwiek różni się odo.__module__
?".".join([o.__module__, o.__name__])
dla Pythona3AttributeError: 'AttributeError' object has no attribute '__module__'
Podane odpowiedzi nie dotyczą klas zagnieżdżonych. Chociaż nie jest dostępna przed wersją Python 3.3 ( PEP 3155 ), naprawdę chcesz użyć
__qualname__
tej klasy. Ostatecznie (3.4? PEP 395 )__qualname__
będzie również istnieć dla modułów do obsługi przypadków, w których nazwa modułu zostanie zmieniona (tj. Kiedy zostanie zmieniona na__main__
).źródło
Type.__module__ + '.' + Type.__qualname__
.__qualname__
nadal występuje tylko nazwa klasyRozważ użycie
inspect
modułu, który ma funkcje, takie jakgetmodule
to, czego szukasz:źródło
inspect.getmodule()
zwraca obiekty modułu - nie w pełni kwalifikowane nazwy klas. W rzeczywistościinspect
moduł nie zapewnia żadnej funkcjonalności, która faktycznie rozwiązałaby to pytanie. Ta odpowiedź nie jest odpowiedzią.</facepalm>
Oto jedna oparta na doskonałej odpowiedzi Grega Bacona, ale z kilkoma dodatkowymi kontrolami:
__module__
może byćNone
(zgodnie z dokumentacją), a także dla typu takiego jakstr
może być__builtin__
(którego możesz nie chcieć pojawiać się w logach lub czymkolwiek). Poniższe testy sprawdzają obie te możliwości:(Może być lepszy sposób sprawdzenia
__builtin__
. Powyższe opiera się tylko na fakcie, że str jest zawsze dostępny, a jego moduł jest zawsze__builtin__
)źródło
Dla pythona3.7 używam:
Zdobywanie:
źródło
obj
musi to być klasa, a nie instancja obiektu.__module__
załatwi sprawę.Próbować:
Ta witryna sugeruje, że
__package__
może to działać w przypadku Pythona 3.0; Jednak podane tam przykłady nie będą działać na mojej konsoli Pythona 2.5.2.źródło
"%s.%s" % (x.__class__.__module__, x.__class__.__name__)
To hack, ale obsługuję 2.6 i potrzebuję tylko czegoś prostego:
źródło
__repr__()
implementacji w sprawdzonej klasy ( i na__str__()
nie są nadpisane). W większości przypadków bezużyteczne.Niektórzy (np. Https://stackoverflow.com/a/16763814/5766934 ) twierdzą, że
__qualname__
jest lepsze niż__name__
. Oto przykład, który pokazuje różnicę:Uwaga, działa również poprawnie dla buildów:
źródło
Ponieważ celem tego tematu jest uzyskanie w pełni kwalifikowanych nazw, oto pułapka, która pojawia się podczas używania importu względnego wraz z głównym modułem istniejącym w tym samym pakiecie. Np. Z poniższą konfiguracją modułu:
Oto dane wyjściowe przedstawiające wynik importowania tego samego modułu w inny sposób:
Kiedy hum importuje pasek przy użyciu ścieżki względnej, bar widzi
Baz.__module__
po prostu „baz”, ale w drugim imporcie, który używa pełnej nazwy, bar widzi to samo, co „foo.baz”.Jeśli gdzieś utrwalasz w pełni kwalifikowane nazwy, lepiej unikać importu względnego dla tych klas.
źródło
Żadna z odpowiedzi tutaj nie zadziałała. W moim przypadku używałem Pythona 2.7 i wiedziałem, że będę pracował tylko z
object
klasami newstyle .źródło