Para fines de registro, quiero recuperar el nombre de clase totalmente calificado de un objeto Python. (Con totalmente calificado me refiero al nombre de la clase, incluido el paquete y el nombre del módulo).
Lo sé x.__class__.__name__
, pero ¿hay un método simple para obtener el paquete y el módulo?
python
python-datamodel
Hanno S.
fuente
fuente
o.__class__.__module__
Alguna vez es diferente deo.__module__
?".".join([o.__module__, o.__name__])
Python3AttributeError: 'AttributeError' object has no attribute '__module__'
Las respuestas proporcionadas no tratan con clases anidadas. Aunque no está disponible hasta Python 3.3 ( PEP 3155 ), realmente desea utilizar
__qualname__
la clase. Eventualmente (3.4? PEP 395 ),__qualname__
también existirá para que los módulos se ocupen de los casos en los que se renombra el módulo (es decir, cuando se renombra__main__
).fuente
Type.__module__ + '.' + Type.__qualname__
.__qualname__
todavía solo se resuelve con el nombre de la claseConsidere usar el
inspect
módulo que tiene funciones como lasgetmodule
que podrían estar buscando:fuente
inspect.getmodule()
devuelve objetos de módulo : nombres de clase no totalmente calificados. De hecho, elinspect
módulo no proporciona ninguna funcionalidad que realmente aborde esta pregunta. Esta respuesta es una no respuesta.</facepalm>
Aquí hay uno basado en la excelente respuesta de Greg Bacon, pero con un par de comprobaciones adicionales:
__module__
puede serNone
(según los documentos), y también para un tipo comostr
puede ser__builtin__
(que es posible que no desee que aparezca en los registros o lo que sea). Las siguientes comprobaciones para ambas posibilidades:(Puede haber una mejor manera de verificarlo
__builtin__
. Lo anterior solo se basa en el hecho de que str siempre está disponible y su módulo siempre está disponible__builtin__
)fuente
Para python3.7 yo uso:
Consiguiendo:
fuente
obj
debe ser una clase en lugar de una instancia de objeto.__module__
Haría el truco.Tratar:
Este sitio sugiere que
__package__
podría funcionar para Python 3.0; Sin embargo, los ejemplos dados allí no funcionarán en mi consola Python 2.5.2.fuente
"%s.%s" % (x.__class__.__module__, x.__class__.__name__)
Este es un truco, pero estoy soportando 2.6 y solo necesito algo simple:
fuente
__repr__()
implementación en la clase marcada ( y de__str__()
no ser anulada). Inútil en la mayoría de los casos.Algunas personas (por ejemplo, https://stackoverflow.com/a/16763814/5766934 ) argumentan que
__qualname__
es mejor que__name__
. Aquí hay un ejemplo que muestra la diferencia:Tenga en cuenta que también funciona correctamente para buildins:
fuente
Dado que el interés de este tema es obtener nombres totalmente calificados, aquí hay una trampa que ocurre cuando se usan importaciones relativas junto con el módulo principal existente en el mismo paquete. Por ejemplo, con la siguiente configuración del módulo:
Aquí está el resultado que muestra el resultado de importar el mismo módulo de manera diferente:
Cuando hum importa la barra usando la ruta relativa, la barra solo ve
Baz.__module__
"baz", pero en la segunda importación que usa el nombre completo, la barra ve lo mismo que "foo.baz".Si persiste los nombres completos en alguna parte, es mejor evitar las importaciones relativas para esas clases.
fuente
Ninguna de las respuestas aquí funcionó para mí. En mi caso, estaba usando Python 2.7 y sabía que solo estaría trabajando con
object
clases de estilo nuevo.fuente