var_dump values print_r print imprimir array _post php python debugging

php - values - var_dump python



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

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?


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


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)


Escribí una alternativa muy ligera para 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


La var_export() 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 () [...]"


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


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

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

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


Para mostrar bien un valor, puede utilizar el módulo de pprint . 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.


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)


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__