Existe-t-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 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.

693
demandé sur martineau 2008-10-10 20:19:27
la source

22 ответов

vous mélangez vraiment deux choses différentes.

Use dir() , vars() ou le module inspect 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__

Imprimer le dictionnaire toutefois de fantaisie que 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',
...

Jolie impression est également disponible dans le débogueur interactif comme une 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__'}
432
répondu 2017-05-04 17:04:36
la source

Vous voulez vars() mélangé avec des pprint() :

from pprint import pprint
pprint(vars(your_object))
755
répondu Jeremy Cantrell 2017-06-10 00:29:09
la source
def dump(obj):
  for attr in dir(obj):
    print("obj.%s = %r" % (attr, getattr(obj, attr)))

il y a beaucoup de fonctions tierces dehors qui ajoutent des choses comme le traitement des exceptions, l'impression de caractères nationaux/Spéciaux, la récursion dans des objets imbriqués etc. selon leurs auteurs préférences. Mais ils se résument tous à ça.

145
répondu Dan Lenski 2018-01-15 20:09:28
la source

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

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

o = O()

Voici la sortie:

>>> o.__dict__

{'value': 3}
38
répondu eduffy 2017-07-28 18:29:25
la source

Pour imprimer l'état actuel de l'objet:

>>> obj # in an interpreter

ou

print repr(obj) # in a script

ou

print obj

pour vos classes, définissez les méthodes __str__ ou __repr__ . De la documentation Python :

__repr__(self) appelé par la fonction intégrée repr() et par chaîne conversions (guillemets inversés) en calculer la chaîne "officielle" représentation d'un objet. Si possible, cela devrait ressembler à un une expression valide de Python qui pourrait être utilisé pour recréer un objet avec la même valeur (soit approprié environnement.) Si ce n'est pas possible, une chaîne de la forme "<...certains utiles Description...>" doit être retourné. La valeur de retour doit être une chaîne objet. Si une classe définit repr () mais pas __str__() , alors __repr__() est aussi utilisé quand un chaîne "informelle" représentation des instances de ce type la classe est nécessaire. C'est typiquement utilisé pour le débogage, il est donc important de que la représentation est riche en informations, et sans ambiguïté.

__str__(self) appelé par la fonction str() intégrée et par l'impression déclaration pour calculer le " informel" représentation sous forme de chaîne d'un objet. Cela diffère de __repr__() en ce que il n'est pas nécessaire que ce soit un Python valide expression: un plus pratique ou représentation concise peut être utilisé plutôt. La valeur de retour doit être objet de type string.

19
répondu jfs 2008-10-11 11:29:09
la source

vous pouvez utiliser la fonction" dir () " pour cela.

>>> 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 caractéristique 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
18
répondu Joe Skora 2008-10-11 00:05:41
la source

pourrait être intéressant à vérifier ...

y a-t-il un Python équivalent aux données de Perl::Dumper?

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 le faites pas souhaitez la méthode de l'objet des fonctions à la sortie). Ceci peut être utilisé pour la persistance, mais le but commun est le débogage.

il y a un certain nombre de choses que Python pprint standard ne parvient pas à réaliser, en particulier il arrête simplement de descendre quand il voit une instance d'un objet et vous donne le pointeur hexadécimal interne de l'objet (errr, ce pointeur n'est pas d'une grande utilité d'ailleurs). Donc, en un mot, python est tout au sujet de ce grand paradigme orienté objet, mais le outils vous sortir de la boîte sont conçus pour travailler avec autre chose que des objets.

les données perl::Dumper vous permet de contrôler la profondeur que vous voulez aller, et détecte également les structures circulaires liées (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).

13
répondu Tel 2017-05-23 13:31:37
la source

dans la plupart des cas, en utilisant __dict__ ou dir() vous obtiendrez l'information que vous voulez. Si vous avez besoin de plus de détails, la bibliothèque standard inclut le module inspect , ce qui vous permet d'obtenir une quantité impressionnante de détails. Certains des vrais nuggests de l'information comprennent:

  • les noms de fonction et des paramètres de la méthode
  • les hiérarchies de classe
  • code source de la mise en œuvre d'une fonction / Classe d'objets
  • variables locales d'une image de l'objet

si vous êtes à la recherche de " quelles valeurs d'attribut mon objet possède-t-il?", puis dir() et __dict__ sont probablement suffisantes. 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.

10
répondu William McVey 2015-08-24 11:44:18
la source

Un métaprogrammation exemple objet image avec de la magie :

$ cat dump.py
#!/usr/bin/python
import sys
if len(sys.argv) > 2:
    module, metaklass  = sys.argv[1:3]
    m = __import__(module, globals(), locals(), [metaklass])
    __metaclass__ = getattr(m, metaklass)

class Data:
    def __init__(self):
        self.num = 38
        self.lst = ['a','b','c']
        self.str = 'spam'
    dumps   = lambda self: repr(self)
    __str__ = lambda self: self.dumps()

data = Data()
print data

sans arguments:

$ python dump.py
<__main__.Data instance at 0x00A052D8>

Avec Gnosis Utils :

$ python dump.py gnosis.magic MetaXMLPickler
<?xml version="1.0"?>
<!DOCTYPE PyObject SYSTEM "PyObjects.dtd">
<PyObject module="__main__" class="Data" id="11038416">
<attr name="lst" type="list" id="11196136" >
  <item type="string" value="a" />
  <item type="string" value="b" />
  <item type="string" value="c" />
</attr>
<attr name="num" type="numeric" value="38" />
<attr name="str" type="string" value="spam" />
</PyObject>

il est un peu dépassé mais fonctionne toujours.

7
répondu jfs 2009-03-28 18:43:33
la source

si vous utilisez ceci pour déboguer, et que vous voulez juste un dump récursif de tout, la réponse acceptée n'est pas satisfaisante parce qu'elle exige que vos classes aient déjà de bonnes implémentations __str__ . Si ce n'est pas le cas, cela fonctionne beaucoup mieux:

import json
print(json.dumps(YOUR_OBJECT, 
                 default=lambda obj: vars(obj),
                 indent=1))
5
répondu Adam Cath 2014-11-24 00:20:22
la source

j'avais besoin d'imprimer des informations de débogage dans certains journaux et j'étais incapable d'utiliser pprint parce que cela le briserait. Au lieu de ça, j'ai fait ça et j'ai eu pratiquement la même chose.

DO = DemoObject()

itemDir = DO.__dict__

for i in itemDir:
    print '{0}  :  {1}'.format(i, itemDir[i])
3
répondu DaOneTwo 2013-06-28 23:36:55
la source

dump "monobjet":

from bson import json_util
import json

print(json.dumps(myObject, default=json_util.default, sort_keys=True, indent=4, separators=(',', ': ')))

j'ai essayé vars() et dir(); les deux ont échoué pour ce que je cherchais. vars () n'a pas fonctionné parce que l'objet n'avait pas __dict__ (exceptions.TypeError: vars() l'argument 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 json.décharges() pourrait fonctionner pour la plupart des objets sans les par défaut=json_util.par défaut, mais j'avais un champ datetime dans l'objet donc le serializer JSON standard a échoué. Voir comment surmonter" datetime.datetime not JSON serialisable " en python?

3
répondu Clark 2017-05-23 15:18:27
la source
from pprint import pprint

def print_r(the_object):
    print ("CLASS: ", the_object.__class__.__name__, " (BASE CLASS: ", the_object.__class__.__bases__,")")
    pprint(vars(the_object))
3
répondu 32ndghost 2014-07-14 19:01:07
la source

cette impression recursive de tout le contenu de l'objet en format indenté JSON ou yaml:

import jsonpickle # pip install jsonpickle
import json
import yaml # pip install pyyaml

serialized = jsonpickle.encode(obj, max_depth=2) # max_depth is optional
print json.dumps(json.loads(serialized), indent=4)
print yaml.dump(yaml.load(serialized), indent=4)
3
répondu wisbucky 2016-03-05 03:33:52
la source

Juste essayer de beeprint .

il vous aidera non seulement avec des variables d'objet d'impression, mais belle sortie ainsi, comme ceci:

class(NormalClassNewStyle):
  dicts: {
  },
  lists: [],
  static_props: 1,
  tupl: (1, 2)
3
répondu Anyany Pan 2018-09-28 17:39:12
la source

pprint contient une "jolie imprimante" pour produire des représentations esthétiquement agréables de vos structures de données. Le formateurproduit des représentations de structures de données qui peuvent être interprété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 en retrait lorsque divisé en plusieurs lignes.

2
répondu shahjapan 2010-09-13 09:11:22
la source

Try ppretty

from ppretty import ppretty


class A(object):
    s = 5

    def __init__(self):
        self._p = 8

    @property
    def foo(self):
        return range(10)


print ppretty(A(), show_protected=True, show_static=True, show_properties=True)

sortie:

__main__.A(_p = 8, foo = [0, 1, ..., 8, 9], s = 5)
2
répondu Symon 2016-07-28 10:14:28
la source

pourquoi pas quelque chose de simple:

for key,value in obj.__dict__.iteritems():
    print key,value
2
répondu Michael Thamm 2016-07-28 10:16:02
la source

j'ai noté 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, alors faire quelque chose comme:

from pprint import pprint
pprint(my_var)

my_var est votre variable d'intérêt. Quand j'ai utilisé pprint (Vars (my_var)) Je n'ai rien obtenu, et d'autres réponses ici n'ont pas aidé ou la méthode a semblé inutilement longue. Par ailleurs, dans mon cas particulier, le code que j'inspectais avait un dictionnaire des dictionnaires.

vaut la peine de souligner qu'avec certaines classes personnalisées, vous pouvez simplement finir avec une sortie <someobject.ExampleClass object at 0x7f739267f400> inutile. Dans ce cas, vous pourriez avoir à mettre en œuvre une méthode __str__ , ou essayer certaines des autres solutions. J'aimerais quand même trouver quelque chose de simple qui fonctionne dans tous les scénarios, sans bibliothèques tierces.

2
répondu Nagev 2017-10-09 11:07:32
la source

vous pouvez essayer la barre D'outils de débogage Flask.

https://pypi.python.org/pypi/Flask-DebugToolbar

from flask import Flask
from flask_debugtoolbar import DebugToolbarExtension

app = Flask(__name__)

# the toolbar is only enabled in debug mode:
app.debug = True

# set a 'SECRET_KEY' to enable the Flask session cookies
app.config['SECRET_KEY'] = '<replace with a secret key>'

toolbar = DebugToolbarExtension(app)
0
répondu Slipstream 2016-03-07 19:41:44
la source

j'aime travailler avec des types d'objets Python clés ou valeurs .

Pour les attributs indépendamment du fait qu'elles sont les méthodes ou les variables:

o.keys()

pour les valeurs de ces attributs:

o.values()
0
répondu Evhz 2017-05-04 15:53:28
la source

pour tous ceux qui luttent avec

  • vars() ne renvoie pas tous les attributs.
  • dir() ne renvoie pas les valeurs des attributs.

le code suivant imprime tous les attributs de obj avec leurs valeurs:

for attr in dir(obj):
        try:
            print("obj.{} = {}".format(attr, getattr(obj, attr)))
        except AttributeError:
            print("obj.{} = ?".format(attr))
0
répondu Robert Hönig 2017-09-07 14:40:59
la source