Para fins de registro, quero recuperar o nome completo da classe de um objeto Python. (Com totalmente qualificado, quero dizer o nome da classe, incluindo o nome do pacote e do módulo.)
Eu sei x.__class__.__name__
, mas existe um método simples para obter o pacote e o módulo?
python
python-datamodel
Hanno S.
fonte
fonte
o.__class__.__module__
vez é diferenteo.__module__
?".".join([o.__module__, o.__name__])
para Python3AttributeError: 'AttributeError' object has no attribute '__module__'
As respostas fornecidas não lidam com classes aninhadas. Embora não esteja disponível até o Python 3.3 ( PEP 3155 ), você realmente deseja usar
__qualname__
a classe. Eventualmente (3,4? PEP 395 ),__qualname__
também existirá módulos para lidar com casos em que o módulo é renomeado (ou seja, quando é renomeado para__main__
).fonte
Type.__module__ + '.' + Type.__qualname__
.__qualname__
ainda só resolve para o nome da classeConsidere usar o
inspect
módulo que possui funções como asgetmodule
que podem estar procurando:fonte
inspect.getmodule()
retorna objetos do módulo - nomes de classes não totalmente qualificados. De fato, oinspect
módulo não fornece nenhuma funcionalidade que realmente resolva essa questão. Esta resposta é uma não resposta.</facepalm>
Aqui está um baseado na excelente resposta de Greg Bacon, mas com algumas verificações extras:
__module__
pode serNone
(de acordo com a documentação) e também para um tipo comostr
ele pode ser__builtin__
(que talvez você não queira que apareça nos logs ou seja o que for). O seguinte verifica essas duas possibilidades:(Pode haver uma maneira melhor de verificar
__builtin__
. O exemplo acima depende apenas do fato de que str está sempre disponível e seu módulo está sempre__builtin__
)fonte
Para python3.7 eu uso:
Obtendo:
fonte
obj
deve ser uma classe e não uma instância de objeto.__module__
faria o truque.Experimentar:
Este site sugere que
__package__
pode funcionar no Python 3.0; No entanto, os exemplos dados aqui não funcionarão no meu console Python 2.5.2.fonte
"%s.%s" % (x.__class__.__module__, x.__class__.__name__)
Este é um truque, mas estou suportando o 2.6 e só preciso de algo simples:
fonte
__repr__()
implementação na classe marcada ( e de__str__()
não ser substituída). Inútil na maioria dos casos.Algumas pessoas (por exemplo, https://stackoverflow.com/a/16763814/5766934 ) argumentam que isso
__qualname__
é melhor do que__name__
. Aqui está um exemplo que mostra a diferença:Observe que também funciona corretamente para buildins:
fonte
Como o interesse deste tópico é obter nomes totalmente qualificados, aqui está uma armadilha que ocorre ao usar importações relativas junto com o módulo principal existente no mesmo pacote. Por exemplo, com a configuração do módulo abaixo:
Aqui está a saída que mostra o resultado da importação do mesmo módulo de maneira diferente:
Quando hum importa bar usando o caminho relativo, bar vê
Baz.__module__
apenas "baz", mas na segunda importação que usa o nome completo, bar vê o mesmo que "foo.baz".Se você persistir com os nomes totalmente qualificados em algum lugar, é melhor evitar importações relativas para essas classes.
fonte
Nenhuma das respostas aqui funcionou para mim. No meu caso, eu estava usando o Python 2.7 e sabia que só estaria trabalhando com
object
classes newstyle .fonte