À des fins de journalisation, je souhaite récupérer le nom de classe complet d'un objet Python. (Avec pleinement qualifié, je veux dire le nom de la classe, y compris le nom du package et du module.)
Je sais x.__class__.__name__
, mais existe-t-il une méthode simple pour obtenir le package et le module?
python
python-datamodel
Hanno S.
la source
la source
o.__class__.__module__
jamais différent deo.__module__
?".".join([o.__module__, o.__name__])
Python3AttributeError: 'AttributeError' object has no attribute '__module__'
Les réponses fournies ne concernent pas les classes imbriquées. Bien que ce ne soit pas disponible avant Python 3.3 ( PEP 3155 ), vous voulez vraiment utiliser
__qualname__
la classe. Finalement (3.4? PEP 395 ),__qualname__
existera également pour les modules pour traiter les cas où le module est renommé (c'est-à-dire lorsqu'il est renommé en__main__
).la source
Type.__module__ + '.' + Type.__qualname__
.__qualname__
ne résout toujours que le nom de la classePensez à utiliser le
inspect
module qui a des fonctions comme cellesgetmodule
qui pourraient être ce que vous recherchez:la source
inspect.getmodule()
renvoie des objets de module - des noms de classe non qualifiés. En fait, leinspect
module ne fournit aucune fonctionnalité qui répondrait réellement à cette question. Cette réponse est une non-réponse.</facepalm>
En voici une basée sur l'excellente réponse de Greg Bacon, mais avec quelques vérifications supplémentaires:
__module__
peut êtreNone
(selon la documentation), et aussi pour un type commestr
il peut l'être__builtin__
(que vous ne voudrez peut-être pas voir apparaître dans les journaux ou autre). Les vérifications suivantes pour ces deux possibilités:(Il pourrait y avoir une meilleure façon de vérifier
__builtin__
. Ce qui précède repose simplement sur le fait que str est toujours disponible et que son module l'est toujours__builtin__
)la source
Pour python3.7 j'utilise:
Obtenir:
la source
obj
doit s'agir d'une classe plutôt que d'une instance d'objet.__module__
ferait l'affaire.Essayer:
Ce site suggère que cela
__package__
pourrait fonctionner pour Python 3.0; Cependant, les exemples qui y sont donnés ne fonctionneront pas sous ma console Python 2.5.2.la source
"%s.%s" % (x.__class__.__module__, x.__class__.__name__)
C'est un hack mais je supporte 2.6 et j'ai juste besoin de quelque chose de simple:
la source
__repr__()
implémentation dans la classe vérifiée ( et du fait de__str__()
ne pas être surchargée). Inutile dans la plupart des cas.Certaines personnes (par exemple https://stackoverflow.com/a/16763814/5766934 ) soutiennent que
__qualname__
c'est mieux que__name__
. Voici un exemple qui montre la différence:Remarque, cela fonctionne également correctement pour les buildins:
la source
L'intérêt de cette rubrique étant d'obtenir des noms complets, voici un piège qui se produit lors de l'utilisation d'importations relatives avec le module principal existant dans le même package. Par exemple, avec la configuration du module ci-dessous:
Voici la sortie montrant le résultat de l'importation du même module différemment:
Quand hum importe la barre en utilisant le chemin relatif, bar voit
Baz.__module__
simplement "baz", mais dans la seconde importation qui utilise le nom complet, bar voit la même chose que "foo.baz".Si vous conservez les noms complets quelque part, il est préférable d'éviter les importations relatives pour ces classes.
la source
Aucune des réponses ici n'a fonctionné pour moi. Dans mon cas, j'utilisais Python 2.7 et je savais que je ne travaillerais qu'avec des
object
classes newstyle .la source