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?
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.
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))
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() [...] "
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)}
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
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
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.
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)