¿Qué es un equivalente de Python del var_dump () de PHP?

Al depurar en PHP, a menudo me resulta útil simplemente pegar un var_dump () en mi código para mostrarme qué es una variable, cuál es su valor y el mismo para cualquier cosa que contenga.

¿Qué es un buen equivalente de Python para esto?

Para mostrar bien un valor, puede utilizar el módulo de impresión . La forma más fácil de volcar todas las variables con él es hacerlo.

from pprint import pprint pprint(globals()) pprint(locals()) 

Si está ejecutando en CGI, una característica útil de depuración es el módulo cgitb , que muestra el valor de las variables locales como parte del rastreo.

Creo que el mejor equivalente a var_dump($foo, $bar) de PHP var_dump($foo, $bar) es combinar print con vars :

 print vars(foo),vars(bar) 

Lo más cercano a var_dump() pprint() es pprint() con la función getmembers() en el módulo de inspect incorporado:

 from inspect import getmembers from pprint import pprint pprint(getmembers(yourObj)) 

La var_export () de PHP generalmente muestra una versión serializada del objeto que puede ser exec () ‘d para volver a crear el objeto. Lo más cercano a eso en Python es repr ()

“Para muchos tipos, esta función intenta devolver una cadena que produciría un objeto con el mismo valor cuando se pasa a eval () […]”

Así que he tomado las respuestas de esta pregunta y otra pregunta y he llegado más abajo. Sospecho que esto no es lo suficientemente pirónico para la mayoría de las personas, pero realmente quería algo que me permitiera obtener una representación profunda de los valores que tiene una variable desconocida. Agradecería cualquier sugerencia sobre cómo puedo mejorar esto o lograr el mismo comportamiento más fácilmente.

 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 

Aquí está el uso

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

y los resultados.

 {'__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)} 

Escribí una alternativa muy liviana al var_dump de PHP para usar en Python y la convertí en código abierto más tarde.

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

Simplemente puede instalarlo usando pip :

 pip install var_dump 

Viejo tema, pero vale la pena intentarlo.

Aquí hay una función var_dump simple y eficiente:

 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='') 

Salida de muestra:

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

Para tus propias clases, solo def un método __str__

No tengo experiencia con PHP, pero tengo una comprensión de la biblioteca estándar de Python.

Para tus propósitos, Python tiene varios métodos:

módulo de registro ;

Módulo de serialización de objetos que se llama pickle . Usted puede escribir su propio envoltorio del módulo pickle.

Si utiliza var_dump para realizar pruebas, Python tiene sus propios módulos doctest y unittest . Es muy simple y rápido para el diseño.

Utilizo la clase de impresora de auto-escritura, pero dir () también es bueno para generar los campos / valores de la instancia.

 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) 

La muestra de uso:

 Printer(MyClass)