Question Y at-il une fonction intégrée pour imprimer toutes les propriétés et valeurs actuelles d'un objet?


Donc, ce que je cherche ici est quelque chose comme PHP print_r fonction. C'est ainsi que je peux déboguer mes scripts en voyant quel est l'état de l'objet en question.


683
2017-10-10 16:19


origine


Réponses:


Vous mélangez vraiment deux choses différentes.

Utilisation dir(), vars() ou la inspect module pour obtenir ce qui vous intéresse (j'utilise __builtins__ par exemple; vous pouvez utiliser n'importe quel objet à la place).

>>> l = dir(__builtins__)
>>> d = __builtins__.__dict__

Imprimez ce dictionnaire, cependant, vous aimez:

>>> 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__'}

418
2017-10-10 17:27



Tu veux vars() melanger avec pprint():

from pprint import pprint
pprint(vars(your_object))

729
2017-10-11 01:16



def dump(obj):
  for attr in dir(obj):
    print("obj.%s = %r" % (attr, getattr(obj, attr)))

Il existe de nombreuses fonctions tierces qui ajoutent des choses comme la gestion des exceptions, l'impression de caractères nationaux / spéciaux, la récursion dans des objets imbriqués, etc. selon les préférences de leurs auteurs. Mais ils se résument tous à cela.


139
2017-10-10 16:36



dir a été mentionné, mais cela ne vous donnera que les noms des attributs. Si vous voulez aussi leurs valeurs, essayez __dict__.

class O:
   def __init__ (self):
      self.value = 3

o = O()

Voici la sortie:

>>> o.__dict__

{'value': 3}

35
2017-10-10 16:44



Pour imprimer l'état actuel de l'objet, vous pouvez:

>>> obj # in an interpreter

ou

print repr(obj) # in a script

ou

print obj

Pour vos classes définissent __str__ ou __repr__ méthodes Du Documentation Python:

__repr__(self) Appelé par le repr() fonction intégrée et par chaîne   conversions (citations inversées)   calculer la chaîne "officielle"   représentation d'un objet. Si du tout   possible, cela devrait ressembler à   expression Python valide qui pourrait être   utilisé pour recréer un objet avec le   même valeur (compte tenu d'une   environnement). Si ce n'est pas possible,   une chaîne de la forme "<... utile   description ...> "devrait être retourné.   La valeur de retour doit être une chaîne   objet. Si une classe définit repr()   mais non __str__(), puis __repr__() est   également utilisé quand une chaîne "informelle"   la représentation des instances de cette   classe est requise. C'est typiquement   utilisé pour le débogage, il est donc important   que la représentation est   riche en informations et sans ambiguïté.

__str__(self) Appelé par le str() fonction intégrée et par l'impression   déclaration pour calculer le "informel"   représentation en chaîne d'un objet.   Cela diffère de __repr__() en cela   il ne doit pas être un Python valide   expression: un plus pratique ou   une représentation concise peut être utilisée   au lieu. La valeur de retour doit être un   objet chaîne


19
2017-10-11 07:29



Vous pouvez utiliser la fonction "dir ()" pour ce faire.

>>> import sys
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__stderr__', '__stdin__', '__stdo
t__', '_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder
, 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle', 'exc_clear', 'exc_info'
 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'getcheckinterval', 'getdefault
ncoding', 'getfilesystemencoding', 'getrecursionlimit', 'getrefcount', 'getwindowsversion', 'he
version', 'maxint', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_
ache', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile', 'setrecursionlimit
, 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoption
', 'winver']
>>>

Une autre fonctionnalité utile est l'aide.

>>> help(sys)
Help on built-in module sys:

NAME
    sys

FILE
    (built-in)

MODULE DOCS
    http://www.python.org/doc/current/lib/module-sys.html

DESCRIPTION
    This module provides access to some objects used or maintained by the
    interpreter and to functions that interact strongly with the interpreter.

    Dynamic objects:

    argv -- command line arguments; argv[0] is the script pathname if known

17
2017-10-10 16:20



Peut-être intéressant de vérifier -

Existe-t-il un équivalent Python à Data :: Dumper de Perl?

Ma recommandation est la suivante -

https://gist.github.com/1071857

Notez que perl a un module appelé Data :: Dumper qui traduit les données de l'objet en code source perl (NB: il ne traduit PAS le code en source, et presque toujours vous ne voulez pas les fonctions de la méthode object dans la sortie). Cela peut être utilisé pour la persistance, mais le but commun est pour le débogage.

Il y a un certain nombre de choses que python pprint ne parvient pas à atteindre, en particulier il arrête juste 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 utile le chemin). Donc, en un mot, python est tout au sujet de ce grand paradigme orienté objet, mais les outils que vous obtenez hors de la boîte sont conçus pour travailler avec autre chose que des objets.

Le perl Data :: Dumper vous permet de contrôler la profondeur que vous voulez atteindre, et détecte également les structures liées circulaires (c'est vraiment important). Ce processus est fondamentalement plus facile à réaliser en Perl parce que les objets n'ont pas de magie particulière au-delà de leur bénédiction (un processus universellement bien défini).


12
2017-11-15 04:11



Dans la plupart des cas, en utilisant __dict__ ou dir() vous obtiendra l'information que vous voulez. Si vous avez besoin de plus de détails, la bibliothèque standard inclut inspecter module, qui vous permet d'obtenir une quantité impressionnante de détails. Certains des vrais nuggests d'info incluent:

  • noms des paramètres de fonction et de méthode
  • hiérarchies de classes
  • code source de l'implémentation d'un objet fonctions / classe
  • variables locales d'un objet frame

Si vous recherchez simplement "quelles valeurs d'attribut mon objet a-t-il?", Alors dir() et __dict__ sont probablement suffisants. Si vous cherchez vraiment à creuser dans l'état actuel des objets arbitraires (en gardant à l'esprit que dans Python presque tout est un objet), alors inspect est digne de considération.


9
2017-10-15 14:53