Qu'est-ce qu'un équivalent Python de la version var dump () de PHP? [dupliquer]

cette question a déjà une réponse ici:

  • y a-t-il une fonction intégrée pour imprimer toutes les propriétés et valeurs actuelles d'un objet? 22 réponses

lors du débogage en PHP, je trouve souvent utile de simplement coller un var_dump () dans mon code pour montrez-moi ce qu'est une variable, sa valeur est, et de même pour tout ce qu'il contient.

Qu'est-ce qu'un bon équivalent Python pour cela?

358
demandé sur Zoredache 2008-12-21 03:43:36

10 réponses

pour afficher une valeur correctement, vous pouvez utiliser le module pprint . La façon la plus facile de vider toutes les variables avec elle est de faire

from pprint import pprint

pprint(globals())
pprint(locals())

si vous utilisez CGI, une fonctionnalité de débogage utile est le module cgitb , qui affiche la valeur des variables locales dans le cadre du traceback.

236
répondu Martin v. Löwis 2017-03-24 22:08:09

je pense que le meilleur équivalent de PHP var_dump($foo, $bar) est de combiner print avec vars :

print vars(foo),vars(bar)
288
répondu Jan 2015-10-30 16:45:27

la chose la plus proche de PHP 's var_dump() est pprint() avec la fonction getmembers() dans le module intégré inspect :

from inspect import getmembers
from pprint import pprint
pprint(getmembers(yourObj))
45
répondu Hai Phaikawl 2014-05-09 05:10:40

PHP var_export () affiche habituellement une version sérialisée de l'objet qui peut être exec ()'d pour recréer l'objet. La chose la plus proche de celle en Python est repr ()

" pour plusieurs types, cette fonction tente de retourner une chaîne de caractères qui donnerait un objet avec la même valeur lorsqu'elle est passée à eval() [...] "

23
répondu Cody Casterline 2010-10-26 09:32:17

donc j'ai pris les réponses de cette question et une autre question et est venu ci-dessous. Je soupçonne que ce n'est pas assez pythonique pour la plupart des gens, mais je voulais vraiment quelque chose qui me permette d'obtenir une représentation profonde des valeurs d'une variable inconnue. J'apprécierais toutes les suggestions sur la façon dont je peux améliorer ceci ou atteindre le même comportement plus facile.

def dump(obj):
  '''return a printable representation of an object for debugging'''
  newobj=obj
  if '__dict__' in dir(obj):
    newobj=obj.__dict__
    if ' object at ' in str(obj) and not newobj.has_key('__type__'):
      newobj['__type__']=str(obj)
    for attr in newobj:
      newobj[attr]=dump(newobj[attr])
  return newobj

Voici l'usage

class stdClass(object): pass
obj=stdClass()
obj.int=1
obj.tup=(1,2,3,4)
obj.dict={'a':1,'b':2, 'c':3, 'more':{'z':26,'y':25}}
obj.list=[1,2,3,'a','b','c',[1,2,3,4]]
obj.subObj=stdClass()
obj.subObj.value='foobar'

from pprint import pprint
pprint(dump(obj))

et les résultats.

{'__type__': '<__main__.stdClass object at 0x2b126000b890>',
 'dict': {'a': 1, 'c': 3, 'b': 2, 'more': {'y': 25, 'z': 26}},
 'int': 1,
 'list': [1, 2, 3, 'a', 'b', 'c', [1, 2, 3, 4]],
 'subObj': {'__type__': '<__main__.stdClass object at 0x2b126000b8d0>',
            'value': 'foobar'},
 'tup': (1, 2, 3, 4)}
15
répondu Zoredache 2017-05-23 12:02:59

j'ai écrit une alternative très légère à var_dump de PHP pour l'utilisation en Python et l'ai fait open source plus tard.

GitHub: https://github.com/sha256/python-var-dump

vous pouvez simplement l'installer en utilisant pip :

pip install var_dump
13
répondu sha256 2014-05-09 05:12:31

Vieux sujet, mais ça vaut le coup d'essayer.

Voici une fonction simple et efficace var_dump :

def var_dump(var, prefix=''):
    """
    You know you're a php developer when the first thing you ask for
    when learning a new language is 'Where's var_dump?????'
    """
    my_type = '[' + var.__class__.__name__ + '(' + str(len(var)) + ')]:'
    print(prefix, my_type, sep='')
    prefix += '    '
    for i in var:
        if type(i) in (list, tuple, dict, set):
            var_dump(i, prefix)
        else:
            if isinstance(var, dict):
                print(prefix, i, ': (', var[i].__class__.__name__, ') ', var[i], sep='')
            else:
                print(prefix, '(', i.__class__.__name__, ') ', i, sep='')

sortie de L'échantillon:

>>> var_dump(zen)

[list(9)]:
    (str) hello
    (int) 3
    (int) 43
    (int) 2
    (str) goodbye
    [list(3)]:
        (str) hey
        (str) oh
        [tuple(3)]:
            (str) jij
            (str) llll
            (str) iojfi
    (str) call
    (str) me
    [list(7)]:
        (str) coucou
        [dict(2)]:
            oKey: (str) oValue
            key: (str) value
        (str) this
        [list(4)]:
            (str) a
            (str) new
            (str) nested
            (str) list
3
répondu Jivan 2018-04-12 14:22:49

print

pour vos propres classes, juste def a __str__ méthode

2
répondu Oli 2008-12-21 00:58:36

Je n'ai pas D'expérience PHP, mais j'ai une compréhension de la bibliothèque standard de Python.

pour vos besoins, Python a plusieurs méthodes:

journalisation "151970920 module";

Objet de sérialisation module qui s'appelle cornichon . Vous pouvez écrire votre propre wrapper du module pickle.

si vous utilisez var_dump pour tester, Python a son propre doctest et unittest modules. C'est très simple et rapide pour la conception.

2
répondu Dmitry Zagorulkin 2014-05-09 05:12:04

j'utilise la classe D'Imprimante Auto-écrite, mais dir() est également bon pour la sortie des champs/valeurs de l'instance.

class Printer:

       def __init__ (self, PrintableClass):
           for name in dir(PrintableClass):
               value = getattr(PrintableClass,name)
               if  '_' not in str(name).join(str(value)):
                    print '  .%s: %r' % (name, value)

L'exemple d'utilisation:

Printer(MyClass)
1
répondu 2009-09-18 09:08:37