В целях ведения журнала я хочу получить полное имя класса объекта Python. (Под полной квалификацией я подразумеваю имя класса, включая имя пакета и модуля.)
Я знаю о x.__class__.__name__
, но есть ли простой способ получить пакет и модуль?
python
python-datamodel
Ханно С.
источник
источник
o.__class__.__module__
когда-нибудь отo.__module__
?".".join([o.__module__, o.__name__])
для Python3AttributeError: 'AttributeError' object has no attribute '__module__'
Приведенные ответы не относятся к вложенным классам. Хотя он недоступен до Python 3.3 ( PEP 3155 ), вы действительно хотите использовать
__qualname__
этот класс. В конце концов (3.4 - PEP 395 )__qualname__
также будет существовать для модулей, чтобы иметь дело со случаями, когда модуль переименовывается (т.е. когда он переименовывается__main__
).источник
Type.__module__ + '.' + Type.__qualname__
.__qualname__
все еще разрешается только имя классаПодумайте об использовании
inspect
модуля, который имеет такие функции,getmodule
которые могут быть тем, что вы ищете:источник
inspect.getmodule()
возвращает объекты модуля - не полностью определенные имена классов. На самом деле,inspect
модуль не предоставляет никакой функциональности, которая бы фактически решала этот вопрос. Этот ответ не является ответом.</facepalm>
Вот один из них, основанный на превосходном ответе Грега Бэкона, но с парой дополнительных проверок:
__module__
может бытьNone
(в соответствии с документами), а также для типа, какstr
это может быть__builtin__
(который вы не хотели бы появляться в журналах или любой другой). Следующие проверки обеих этих возможностей:(Там может быть лучший способ проверить
__builtin__
. Вышеприведенное опирается только на тот факт, что str всегда доступен, а его модуль всегда__builtin__
)источник
Для python3.7 я использую:
Получение:
источник
obj
должен быть класс, а не экземпляр объекта.__module__
сделал бы трюк.Пытаться:
Этот сайт предполагает, что
__package__
может работать для Python 3.0; Однако приведенные там примеры не будут работать под моей консолью Python 2.5.2.источник
"%s.%s" % (x.__class__.__module__, x.__class__.__name__)
Это хак, но я поддерживаю 2.6 и просто нужно что-то простое:
источник
__repr__()
реализации в проверенном классе ( и от того, чтобы__str__()
не быть переопределенным). Бесполезно в большинстве случаев.Некоторые люди (например, https://stackoverflow.com/a/16763814/5766934 ) утверждают, что
__qualname__
это лучше, чем__name__
. Вот пример, который показывает разницу:Обратите внимание, это также работает правильно для buildins:
источник
Поскольку интерес этой темы состоит в том, чтобы получить полные имена, вот ловушка, которая возникает при использовании относительного импорта вместе с основным модулем, существующим в том же пакете. Например, с настройкой модуля ниже:
Вот вывод, показывающий результат импорта одного и того же модуля по-разному:
Когда hum импортирует bar, используя относительный путь, bar видит
Baz.__module__
просто «baz», но во втором импорте, который использует полное имя, bar видит то же самое, что и «foo.baz».Если вы где-то сохраняете полные имена, лучше избегать относительного импорта для этих классов.
источник
Ни один из ответов здесь не работал для меня. В моем случае я использовал Python 2.7 и знал, что буду работать только с
object
классами нового стиля .источник