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?
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.
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))
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 () [...]"
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
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)}
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
print
Pour vos propres classes, il suffit de définir une méthode __str__
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.
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)