201 votes

Obtenir le nom de classe complet d'un objet en python

À des fins de journalisation, je souhaite récupérer le nom de classe complet d'un objet Python. (Par qualifié complet, je veux dire le nom de la classe, y compris le nom du paquet et du module.)

Je sais à propos de x.__class__.__name__ , mais existe-t-il une méthode simple pour obtenir le package et le module?

220voto

Greg Bacon Points 50449

Avec le programme suivant

 #! /usr/bin/env python

import foo

def fullname(o):
  return o.__module__ + "." + o.__class__.__name__

bar = foo.Bar()
print fullname(bar)
 

et Bar défini comme

 class Bar(object):
  def __init__(self, v=42):
    self.val = v
 

la sortie est

 $ ./prog.py
foo.Bar
 

60voto

Nathan Binkert Points 3096

Les réponses fournies ne traitent pas des classes imbriquées. Bien que ce dernier ne soit disponible qu’en python 3.3 ( PEP 3155 ), vous voulez vraiment utiliser __qualname__ de la classe. Éventuellement (3.4? PEP 395 ), __qualname__ existera également pour les modules afin de traiter les cas dans lesquels le module est renommé (c'est-à-dire lorsqu'il est renommé __main__ ).

33voto

MB. Points 2847

Voici l'une basée sur Greg Bacon excellente réponse, mais avec un couple de contrôles supplémentaires:

__module__ peut None (selon les docs), et aussi pour un type comme str il peut être __builtin__ (ce que vous ne voulez apparaître dans les journaux ou quoi que ce soit). Les vérifications suivantes pour ces deux possibilités:

def fullname(o):
    module = o.__class__.__module__
    if module is None or module == str.__class__.__module__:
        return o.__class__.__name__
    return module + '.' + o.__class__.__name__

(Il pourrait y avoir une meilleure façon de vérifier __builtin__. Le ci-dessus ne s'appuie sur le fait que la str est toujours disponible, et son module est toujours __builtin__)

21voto

Tendayi Mawushe Points 10335

Pensez à utiliser le module inspect qui comporte des fonctions telles que getmodule qui pourraient être ce que vous recherchez:

 >>>import inspect
>>>import xml.etree.ElementTree
>>>et = xml.etree.ElementTree.ElementTree()
>>>inspect.getmodule(et)
<module 'xml.etree.ElementTree' from 
        'D:\tools\python2.5.2\lib\xml\etree\ElementTree.pyc'>
 

11voto

Adam Matan Points 15690

__module__ ferait l'affaire.

essayer:

 >>> import re
>>> print re.compile.__module__
re
 

Ce site suggère que __package__ pourrait fonctionner avec python 3.0; Cependant, les exemples donnés ne fonctionneront pas sous ma console python 2.5.2.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X