Entonces, lo que estoy buscando aquí es algo así como la función print_r de PHP .
Esto es para que pueda depurar mis scripts al ver cuál es el estado del objeto en cuestión.
Entonces, lo que estoy buscando aquí es algo así como la función print_r de PHP .
Esto es para que pueda depurar mis scripts al ver cuál es el estado del objeto en cuestión.
Realmente estás mezclando dos cosas diferentes.
Uso dir()
, vars()
o el inspect
módulo para conseguir lo que le interesa (utilizo __builtins__
como ejemplo, se puede utilizar cualquier objeto en su lugar).
>>> l = dir(__builtins__)
>>> d = __builtins__.__dict__
Imprime ese diccionario como quieras:
>>> print l
['ArithmeticError', 'AssertionError', 'AttributeError',...
o
>>> from pprint import pprint
>>> pprint(l)
['ArithmeticError',
'AssertionError',
'AttributeError',
'BaseException',
'DeprecationWarning',
...
>>> pprint(d, indent=2)
{ 'ArithmeticError': <type 'exceptions.ArithmeticError'>,
'AssertionError': <type 'exceptions.AssertionError'>,
'AttributeError': <type 'exceptions.AttributeError'>,
...
'_': [ 'ArithmeticError',
'AssertionError',
'AttributeError',
'BaseException',
'DeprecationWarning',
...
La impresión bonita también está disponible en el depurador interactivo como un comando:
(Pdb) pp vars()
{'__builtins__': {'ArithmeticError': <type 'exceptions.ArithmeticError'>,
'AssertionError': <type 'exceptions.AssertionError'>,
'AttributeError': <type 'exceptions.AttributeError'>,
'BaseException': <type 'exceptions.BaseException'>,
'BufferError': <type 'exceptions.BufferError'>,
...
'zip': <built-in function zip>},
'__file__': 'pass.py',
'__name__': '__main__'}
__dict__
miembro (unre.MatchObject
por ejemplo), pero incorporadodir()
funciona para todos los objetos.print re.compile(r'slots').search('No slots here either.').__slots__
inspect
módulo en tu respuesta? Creo que es lo más parecido a print_r o var_dump.dir()
, entonces?dir()
solo devuelve una lista de nombres, y no todos existen envars()
o en el__dict__
atributo.Quieres
vars()
mezclar conpprint()
:fuente
vars()
simplemente devuelve el__dict__
de su argumento y ese también es el respaldo dedir()
en caso de que no haya ningún__dir__
método. así quedir()
en primer lugar, como dije.dir()
te ofrece todas las cosas integradas que probablemente no te interesen__str__
y__new__
.var()
no lo hace__dict__
atributo.Existen muchas funciones de terceros que agregan cosas como manejo de excepciones, impresión de caracteres nacionales / especiales, recursión en objetos anidados, etc. de acuerdo con las preferencias de sus autores. Pero todos básicamente se reducen a esto.
fuente
getmembers()
función en elinspect
módulo estándar , pero pensé que esto sería más útil ya que ilustra cómo hacer la introspección en general.__dict__
(como__doc__
y__module__
). Además,__dict__
no funciona en absoluto para los objetos declarados con__slots__
. En general,__dict__
muestra las propiedades de nivel de usuario que realmente se almacenan internamente en un diccionario. dir () muestra más.__dict__
atributo / miembro. Sé que es una locura, pero cierto. Los empotrados comoint
ystr
ore.MatchObject
s son ejemplos comunes. Intenta'hello'.__dict__
, luego intentadir('hello')
se ha mencionado dir , pero eso solo le dará los nombres de los atributos. Si también quieres sus valores, prueba __dict__.
Aquí está la salida:
fuente
set
no tiene__dict__
, por lo que para ellos fallaráAttributeError: 'set' object has no attribute '__dict__'
Puede usar la función "dir ()" para hacer esto.
Otra característica útil es la ayuda.
fuente
Para imprimir el estado actual del objeto, puede:
o
o
Para sus clases definir
__str__
o__repr__
métodos. De la documentación de Python :fuente
print "DEBUG: object value: " + repr(obj)
Podría valer la pena echarle un vistazo --
¿Hay un Python equivalente a Perl's Data :: Dumper?
Mi recomendación es esta:
https://gist.github.com/1071857
Tenga en cuenta que perl tiene un módulo llamado Data :: Dumper que traduce los datos del objeto nuevamente al código fuente de perl (NB: NO traduce el código nuevamente a la fuente, y casi siempre no desea que las funciones del método del objeto en la salida). Esto puede usarse para la persistencia, pero el propósito común es la depuración.
Hay una serie de cosas que el pprint estándar de Python no logra, en particular, simplemente deja de descender cuando ve una instancia de un objeto y le da el puntero hexadecimal interno del objeto (errr, ese puntero no es muy utilizado por la manera). En pocas palabras, python tiene que ver con este gran paradigma orientado a objetos, pero las herramientas que obtiene de la caja están diseñadas para trabajar con algo que no sean objetos.
El perl Data :: Dumper le permite controlar qué tan profundo quiere llegar, y también detecta estructuras enlazadas circulares (eso es realmente importante). Este proceso es fundamentalmente más fácil de lograr en perl porque los objetos no tienen magia particular más allá de su bendición (un proceso universalmente bien definido).
fuente
Recomiendo usar
help(your_object)
.help(dir)
help(vars)
fuente
En la mayoría de los casos, usar
__dict__
odir()
le proporcionará la información que desea. Si necesita más detalles, la biblioteca estándar incluye el módulo de inspección , que le permite obtener una cantidad impresionante de detalles. Algunos de los detalles más reales de información incluyen:Si solo está buscando "¿qué valores de atributo tiene mi objeto?", Entonces
dir()
y__dict__
probablemente sean suficientes. Si realmente está buscando profundizar en el estado actual de los objetos arbitrarios (teniendo en cuenta que en Python casi todo es un objeto), entoncesinspect
es digno de consideración.fuente
No. La respuesta más votada excluye algunos tipos de atributos, y la respuesta aceptada muestra cómo obtener todos los atributos, incluidos los métodos y partes de la API no pública. Pero no hay una buena completa incorporado la función de este.
Entonces, el corto corolario es que puede escribir el suyo propio, pero calculará las propiedades y otros descriptores de datos calculados que son parte de la API pública, y es posible que no desee eso:
Problemas con otras respuestas
Observe la aplicación de la respuesta más votada actualmente en una clase con muchos tipos diferentes de miembros de datos:
solo impresiones:
Porque
vars
solo devuelve el__dict__
de un objeto, y no es una copia, por lo que si modifica el dict devuelto por vars, también está modificando el__dict__
del objeto en sí.devoluciones:
- lo cual es malo porque quux es una propiedad que no deberíamos configurar y no deberíamos estar en el espacio de nombres ...
Aplicar el consejo en la respuesta actualmente aceptada (y otras) no es mucho mejor:
Como podemos ver,
dir
solo devuelve todos (en realidad solo la mayoría) de los nombres asociados con un objeto.inspect.getmembers
, mencionado en los comentarios, tiene fallas similares: devuelve todos los nombres y valores.De clase
Cuando enseño, mis alumnos crean una función que proporciona la API semánticamente pública de un objeto:
Podemos extender esto para proporcionar una copia del espacio de nombres semántico de un objeto, pero debemos excluir los
__slots__
que no están asignados, y si nos tomamos en serio la solicitud de "propiedades actuales", debemos excluir las propiedades calculadas (como podrían volverse caros y podrían interpretarse como no "actuales"):Y ahora no calculamos ni mostramos la propiedad, quux:
Advertencias
Pero quizás sabemos que nuestras propiedades no son caras. Es posible que queramos alterar la lógica para incluirlos también. Y tal vez queremos excluir otros descriptores de datos personalizados .
Entonces necesitamos personalizar aún más esta función. Y entonces tiene sentido que no podamos tener una función incorporada que mágicamente sepa exactamente lo que queremos y lo proporcione. Esta es la funcionalidad que necesitamos para crearnos.
Conclusión
No hay una función integrada que haga esto, y debe hacer lo que sea más semánticamente apropiado para su situación.
fuente
FunctionType
. Pero muy útil, ¡gracias!Un ejemplo de metaprogramación Volcar objeto con magia :
Sin argumentos:
Con Gnosis Utils :
Está un poco anticuado pero sigue funcionando.
fuente
Si está utilizando esto para la depuración, y solo desea un volcado recursivo de todo, la respuesta aceptada es insatisfactoria porque requiere que sus clases ya tengan buenas
__str__
implementaciones. Si ese no es el caso, esto funciona mucho mejor:fuente
TypeError: vars() argument must have __dict__ attribute
Prueba ppretty
Salida:
fuente
fuente
Esto imprime todo el contenido del objeto de forma recursiva en formato sangrado json o yaml:
fuente
He votado a favor la respuesta que menciona solo pprint. Para ser claros, si desea ver todos los valores en una estructura de datos compleja, haga algo como:
Donde my_var es tu variable de interés. Cuando lo usé
pprint(vars(my_var))
no obtuve nada, y otras respuestas aquí no ayudaron o el método parecía innecesariamente largo. Por cierto, en mi caso particular, el código que estaba inspeccionando tenía un diccionario de diccionarios.Vale la pena señalar que con algunas clases personalizadas puede terminar con una inútil
<someobject.ExampleClass object at 0x7f739267f400>
tipo de salida . En ese caso, es posible que deba implementar un__str__
método o probar algunas de las otras soluciones. Todavía me gustaría encontrar algo simple que funcione en todos los escenarios, sin bibliotecas de terceros.fuente
Necesitaba imprimir información de DEPURACIÓN en algunos registros y no pude usar pprint porque la rompería. En cambio, hice esto y obtuve prácticamente lo mismo.
fuente
Para volcar "myObject":
Probé vars () y dir (); ambos fallaron por lo que estaba buscando. vars () no funcionó porque el objeto no tenía __dict__ (excepciones.TypeError: el argumento vars () debe tener el atributo __dict__). dir () no era lo que estaba buscando: es solo una lista de nombres de campo, no da los valores o la estructura del objeto.
Creo que json.dumps () funcionaría para la mayoría de los objetos sin default = json_util.default, pero tenía un campo de fecha y hora en el objeto, por lo que el serializador json estándar falló. Consulte ¿Cómo superar "datetime.datetime no JSON serializable" en python?
fuente
¿Por qué no algo simple?
fuente
for key,value in obj.__dict__.iteritems(): print key,value
?pprint contiene una "bonita impresora" para producir representaciones estéticamente agradables de sus estructuras de datos. El formateador produce representaciones de estructuras de datos que el intérprete puede analizar correctamente, y también son fáciles de leer para un humano. La salida se mantiene en una sola línea, si es posible, y se sangra cuando se divide en varias líneas.
fuente
Solo prueba beeprint .
Le ayudará no solo a imprimir variables de objeto, sino también a una salida hermosa, como esta:
fuente
Para todos los que luchan con
vars()
No devuelve todos los atributos.dir()
no devuelve los valores de los atributos.El siguiente código imprime todos los atributos de
obj
con sus valores:fuente
Puede probar la barra de herramientas de depuración de frascos.
https://pypi.python.org/pypi/Flask-DebugToolbar
fuente
Me gusta trabajar con claves o valores de tipos integrados de objetos de Python .
Para los atributos independientemente de que sean métodos o variables:
Para valores de esos atributos:
fuente
Esto funciona sin importar cómo se definan sus variables dentro de una clase, dentro de __init__ o afuera.
fuente