web-dev-qa-db-fra.com

Qu'est-ce qu'un Python équivalent du var_dump () de PHP?

Lors du débogage en PHP, je trouve souvent utile de simplement coller un var_dump () dans mon code pour me montrer ce qu'est une variable, quelle est sa valeur et la même chose pour tout ce qu'elle contient.

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

394
Zoredache

Pour afficher correctement une valeur, vous pouvez utiliser le module pprint . Le moyen le plus simple de vider toutes les variables est de le faire

from pprint import pprint

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

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

257
Martin v. Löwis

Je pense que le meilleur équivalent de la fonction var_dump($foo, $bar) de PHP est la combinaison print avec vars :

print vars(foo),vars(bar)
313
Jan

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

from inspect import getmembers
from pprint import pprint
pprint(getmembers(yourObj))
51
Hai Phaikawl

PHP var_export () affiche généralement une version sérialisée de l'objet pouvant être exécutée par exec () pour recréer cet objet. La chose la plus proche de celle de Python est repr ()

"Pour de nombreux types, cette fonction tente de renvoyer une chaîne qui donnerait un objet avec la même valeur lorsqu'elle est transmise à eval () [...]"

23
Cody Casterline

J'ai écrit une alternative très légère au var_dump de PHP pour une utilisation dans Python et l'ai rendu open source plus tard.

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

Vous pouvez simplement l'installer en utilisant pip :

pip install var_dump
16
sha256

Donc, j'ai pris les réponses de cette question et ne autre question et est venu ci-dessous. Je suppose que cela n’est pas assez pour Pythonic 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 cela ou obtenir le même comportement plus facilement.

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
Zoredache

Vieux sujet, mais vaut la peine 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__.__+ '(' + 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='')

Exemple de sortie:

>>> 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
Jivan

print

Pour vos propres classes, il suffit de définir une méthode __str__

2
Oli

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

Pour vos besoins, Python a plusieurs méthodes:

journalisation module;

Module de sérialisation d'objet appelé pickle . Vous pouvez écrire votre propre wrapper du module pickle.

Si vous utilisez var_dump pour les tests, Python a ses propres modules doctest et nittest . C'est très simple et rapide pour le design.

2

J'utilise la classe Printer auto-écrite, mais dir () est également utile pour la sortie des champs/valeurs d'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'échantillon d'utilisation:

Printer(MyClass)
1
Dmitry Nosov