Donc, ce que je recherche ici, c'est quelque chose comme la fonction print_r de PHP .
C'est pour que je puisse déboguer mes scripts en voyant quel est l'état de l'objet en question.
Donc, ce que je recherche ici, c'est quelque chose comme la fonction print_r de PHP .
C'est pour que je puisse déboguer mes scripts en voyant quel est l'état de l'objet en question.
Vous mélangez vraiment deux choses différentes.
Utilisez dir()
, vars()
ou le inspect
module pour obtenir ce qui vous intéresse (j'utilise __builtins__
comme exemple; vous pouvez utiliser n'importe quel objet à la place).
>>> l = dir(__builtins__)
>>> d = __builtins__.__dict__
Imprimez ce dictionnaire comme bon vous semble:
>>> print l
['ArithmeticError', 'AssertionError', 'AttributeError',...
ou
>>> from pprint import pprint
>>> pprint(l)
['ArithmeticError',
'AssertionError',
'AttributeError',
'BaseException',
'DeprecationWarning',
...
>>> pprint(d, indent=2)
{ 'ArithmeticError': <type 'exceptions.ArithmeticError'>,
'AssertionError': <type 'exceptions.AssertionError'>,
'AttributeError': <type 'exceptions.AttributeError'>,
...
'_': [ 'ArithmeticError',
'AssertionError',
'AttributeError',
'BaseException',
'DeprecationWarning',
...
La jolie impression est également disponible dans le débogueur interactif en tant que commande:
(Pdb) pp vars()
{'__builtins__': {'ArithmeticError': <type 'exceptions.ArithmeticError'>,
'AssertionError': <type 'exceptions.AssertionError'>,
'AttributeError': <type 'exceptions.AttributeError'>,
'BaseException': <type 'exceptions.BaseException'>,
'BufferError': <type 'exceptions.BufferError'>,
...
'zip': <built-in function zip>},
'__file__': 'pass.py',
'__name__': '__main__'}
__dict__
membre (unre.MatchObject
par exemple), mais ladir()
fonction intégrée fonctionne pour tous les objets.print re.compile(r'slots').search('No slots here either.').__slots__
inspect
module dans votre réponse? Je pense que c'est la chose la plus proche de print_r ou var_dump.dir()
, alors?dir()
renvoie uniquement une liste de noms, et tous ceux-ci n'existent pas dansvars()
ou dans l'__dict__
attribut.Vous voulez
vars()
mélanger avecpprint()
:la source
vars()
retourne simplement le__dict__
de son argument et c'est aussi la solution de secoursdir()
en cas d'absence de__dir__
méthode. utilisez doncdir()
en premier lieu, comme je l'ai dit.dir()
vous donne toutes les choses intégrées que vous n'aimez probablement pas comme__str__
et__new__
.var()
non.__dict__
attribut.Il existe de nombreuses fonctions tierces qui ajoutent des éléments tels que la gestion des exceptions, l'impression de caractères nationaux / spéciaux, la récurrence dans des objets imbriqués, etc. selon les préférences de leurs auteurs. Mais ils se résument tous à cela.
la source
getmembers()
fonction dans leinspect
module standard , mais je pensais que cela serait plus utile car il illustre comment faire de l'introspection en général.__dict__
(comme__doc__
et__module__
). De plus,__dict__
ne fonctionne pas du tout pour les objets déclarés avec__slots__
. En général,__dict__
affiche les propriétés de niveau utilisateur qui sont réellement stockées dans un dictionnaire en interne. dir () en montre plus.__dict__
attribut / membre. Je sais que c'est fou, mais vrai. Les éléments intégrés tels queint
etstr
oure.MatchObject
s sont des exemples courants. Essayez'hello'.__dict__
, puis essayezdir('hello')
dir a été mentionné, mais cela ne vous donnera que les noms des attributs. Si vous voulez aussi leurs valeurs, essayez __dict__.
Voici la sortie:
la source
set
ça n'en ont pas__dict__
, donc pour eux ça échouera avecAttributeError: 'set' object has no attribute '__dict__'
Vous pouvez utiliser la fonction "dir ()" pour ce faire.
Une autre fonctionnalité utile est l'aide.
la source
Pour imprimer l'état actuel de l'objet, vous pouvez:
ou
ou
Pour vos classes définir
__str__
ou__repr__
méthodes. Dans la documentation Python :la source
print "DEBUG: object value: " + repr(obj)
Cela vaut peut-être la peine d'être vérifié -
Existe-t-il un Python équivalent à Perl's Data :: Dumper?
Ma recommandation est la suivante -
https://gist.github.com/1071857
Notez que perl a un module appelé Data :: Dumper qui convertit les données d'objet en code source perl (NB: il ne convertit PAS le code en source, et presque toujours vous ne voulez pas que les fonctions de méthode objet dans la sortie). Cela peut être utilisé pour la persistance, mais le but commun est le débogage.
Il y a un certain nombre de choses que pprint python standard ne parvient pas à réaliser, en particulier il arrête simplement de descendre lorsqu'il voit une instance d'un objet et vous donne le pointeur hexadécimal interne de l'objet (errr, ce pointeur n'est pas très utilisé par le chemin). Donc, en un mot, python concerne tout ce grand paradigme orienté objet, mais les outils que vous sortez de la boîte sont conçus pour travailler avec autre chose que des objets.
Le Perl Data :: Dumper vous permet de contrôler jusqu'à quelle profondeur vous voulez aller, et détecte également les structures liées circulaires (c'est vraiment important). Ce processus est fondamentalement plus facile à réaliser en perl car les objets n'ont pas de magie particulière au-delà de leur bénédiction (un processus universellement bien défini).
la source
Je recommande d'utiliser
help(your_object)
.help(dir)
help(vars)
la source
Dans la plupart des cas, en utilisant
__dict__
oudir()
vous obtiendrez les informations que vous recherchez. Si vous avez besoin de plus de détails, la bibliothèque standard comprend le module d' inspection , qui vous permet d'obtenir une quantité impressionnante de détails. Certains des vrais pépites d'informations comprennent:Si vous cherchez simplement "quelles valeurs d'attribut mon objet a-t-il?", Alors
dir()
et__dict__
sont probablement suffisantes. Si vous cherchez vraiment à creuser dans l'état actuel des objets arbitraires (en gardant à l'esprit qu'en python presque tout est un objet), alors celainspect
mérite d'être considéré.la source
Non. La réponse la plus votée exclut certains types d'attributs et la réponse acceptée montre comment obtenir tous les attributs, y compris les méthodes et les parties de l'API non publique. Mais il n'y a pas de bonne fonction intégrée complète pour cela.
Donc, le court corollaire est que vous pouvez écrire le vôtre, mais il calculera les propriétés et autres descripteurs de données calculés qui font partie de l'API publique, et vous ne voudrez peut-être pas que:
Problèmes avec d'autres réponses
Observez l'application de la réponse actuellement la plus votée sur une classe avec beaucoup de différents types de membres de données:
imprime uniquement:
Parce
vars
que ne renvoie que l'__dict__
objet d'un objet, et ce n'est pas une copie, donc si vous modifiez le dict retourné par vars, vous modifiez également__dict__
l'objet de l'objet lui-même.Retour:
- ce qui est mauvais car quux est une propriété que nous ne devrions pas définir et ne devrions pas être dans l'espace de noms ...
Appliquer les conseils dans la réponse actuellement acceptée (et dans d'autres) n'est pas beaucoup mieux:
Comme nous pouvons le voir,
dir
ne renvoie que tous (en fait juste la plupart) des noms associés à un objet.inspect.getmembers
, mentionné dans les commentaires, est également imparfait - il renvoie tous les noms et valeurs.De classe
Lorsque j'enseigne, mes élèves créent une fonction qui fournit l'API sémantiquement publique d'un objet:
Nous pouvons étendre cela pour fournir une copie de l'espace de noms sémantique d'un objet, mais nous devons exclure ceux
__slots__
qui ne sont pas attribués, et si nous prenons au sérieux la demande de "propriétés actuelles", nous devons exclure les propriétés calculées (comme ils pourraient devenir coûteux et pourraient être interprétés comme n'étant pas "actuels"):Et maintenant, nous ne calculons ni ne montrons la propriété, quux:
Avertissements
Mais nous savons peut-être que nos propriétés ne sont pas chères. Nous pouvons vouloir modifier la logique pour les inclure également. Et peut-être voulons-nous plutôt exclure d' autres descripteurs de données personnalisés .
Ensuite, nous devons personnaliser davantage cette fonction. Et il est donc logique que nous ne puissions pas avoir une fonction intégrée qui sait comme par magie exactement ce que nous voulons et la fournit. C'est une fonctionnalité dont nous avons besoin pour nous créer.
Conclusion
Il n'y a pas de fonction intégrée qui fait cela, et vous devez faire ce qui est le plus sémantiquement approprié à votre situation.
la source
FunctionType
. Mais très utile - merci!Un exemple de métaprogrammation Dump objet avec magie :
Sans arguments:
Avec Gnosis Utils :
Il est un peu dépassé mais fonctionne toujours.
la source
Si vous l'utilisez pour le débogage et que vous voulez juste un vidage récursif de tout, la réponse acceptée n'est pas satisfaisante car elle nécessite que vos classes aient
__str__
déjà de bonnes implémentations. Si ce n'est pas le cas, cela fonctionne beaucoup mieux:la source
TypeError: vars() argument must have __dict__ attribute
Essayez ppretty
Production:
la source
la source
Ceci imprime récursivement tout le contenu de l'objet au format indenté json ou yaml:
la source
J'ai surévalué la réponse qui ne mentionne que pprint. Pour être clair, si vous voulez voir toutes les valeurs dans une structure de données complexe, faites quelque chose comme:
Où my_var est votre variable d'intérêt. Quand j'ai utilisé
pprint(vars(my_var))
je n'ai rien obtenu, et les autres réponses ici n'ont pas aidé ou la méthode semblait inutilement longue. Soit dit en passant, dans mon cas particulier, le code que j'inspectais avait un dictionnaire de dictionnaires.Il convient de souligner qu'avec certaines classes personnalisées, vous pouvez vous retrouver avec un
<someobject.ExampleClass object at 0x7f739267f400>
type de sortie inutile . Dans ce cas, vous devrez peut-être implémenter une__str__
méthode ou essayer certaines des autres solutions. J'aimerais toujours trouver quelque chose de simple qui fonctionne dans tous les scénarios, sans bibliothèques tierces.la source
J'avais besoin d'imprimer les informations DEBUG dans certains journaux et je n'ai pas pu utiliser pprint car cela les casserait. Au lieu de cela, j'ai fait cela et j'ai pratiquement obtenu la même chose.
la source
Pour vider "myObject":
J'ai essayé vars () et dir (); les deux ont échoué pour ce que je cherchais. vars () n'a pas fonctionné car l'objet n'avait pas __dict__ (exceptions.TypeError: l'argument vars () doit avoir l'attribut __dict__). dir () n'était pas ce que je cherchais: c'est juste une liste de noms de champs, ne donne pas les valeurs ou la structure de l'objet.
Je pense que json.dumps () fonctionnerait pour la plupart des objets sans le défaut = json_util.default, mais j'avais un champ datetime dans l'objet donc le sérialiseur json standard a échoué. Voir Comment surmonter "datetime.datetime non JSON sérialisable" en python?
la source
Pourquoi pas quelque chose de simple:
la source
for key,value in obj.__dict__.iteritems(): print key,value
?pprint contient une «jolie imprimante» pour produire des représentations esthétiques de vos structures de données. Le formateur produit des représentations de structures de données qui peuvent être analysées correctement par l'interpréteur et sont également faciles à lire pour un humain. La sortie est conservée sur une seule ligne, si possible, et indentée lorsqu'elle est divisée en plusieurs lignes.
la source
Essayez simplement l' empreinte d'abeille .
Cela vous aidera non seulement à imprimer des variables d'objet, mais aussi à obtenir une belle sortie, comme ceci:
la source
Pour tout le monde aux prises avec
vars()
ne renvoyant pas tous les attributs.dir()
ne renvoyant pas les valeurs des attributs.Le code suivant imprime tous les attributs de
obj
avec leurs valeurs:la source
Vous pouvez essayer la barre d'outils de débogage Flask.
https://pypi.python.org/pypi/Flask-DebugToolbar
la source
J'aime travailler avec des clés ou des valeurs de types intégrés d'objets python .
Pour les attributs, qu'il s'agisse de méthodes ou de variables:
Pour les valeurs de ces attributs:
la source
Cela fonctionne quelle que soit la façon dont vos variables sont définies au sein d'une classe, à l'intérieur de __init__ ou à l'extérieur.
la source