Estoy empezando a codificar en varios proyectos usando Python (incluido el desarrollo web Django y el desarrollo de juegos Panda3D).
Para ayudarme a comprender lo que está sucediendo, me gustaría básicamente 'mirar' dentro de los objetos de Python para ver cómo funcionan, como sus métodos y propiedades.
Digamos que tengo un objeto Python, ¿qué necesitaría para imprimir su contenido? ¿Es eso posible?
python
introspection
littlejim84
fuente
fuente
object.__dict__
fuente
vars(object)
está hecho para eso.from pprint import pprint; pprint(vars(object))
me dio una buena vista sobre el contenido de mi objeto. Gracias @liberforcePrimero, lee la fuente.
Segundo, usa la
dir()
función.fuente
¡Me sorprende que nadie haya mencionado la ayuda todavía!
La ayuda le permite leer la cadena de documentación y tener una idea de los atributos que podría tener una clase, lo cual es bastante útil.
fuente
Si esto es para explorar para ver qué está pasando, recomendaría mirar IPython . Esto agrega varios accesos directos para obtener una documentación de objetos, propiedades e incluso código fuente. Por ejemplo, agregar un "?" a una función proporcionará la ayuda para el objeto (efectivamente, un acceso directo para "help (obj)", cuando se use dos? '("
func??
") mostrará el código fuente si está disponible.También hay muchas comodidades adicionales, como la finalización de pestañas, la impresión bonita de resultados, el historial de resultados, etc., que lo hacen muy útil para este tipo de programación exploratoria.
Para un uso más programática de la introspección, las órdenes internas básicas como
dir()
,vars()
,getattr
etc. será útil, pero es bien vale la pena su tiempo para revisar la inspeccione módulo. Para buscar el origen de una función, use "inspect.getsource
" por ejemplo, aplicándolo a sí mismo:inspect.getargspec
También es útil con frecuencia si se trata de envolver o manipular funciones, ya que proporcionará los nombres y los valores predeterminados de los parámetros de la función.fuente
Si está interesado en una GUI para esto, eche un vistazo a objbrowser . Utiliza el módulo de inspección de la biblioteca estándar de Python para la introspección de objetos debajo.
fuente
Puede enumerar los atributos de un objeto con dir () en el shell:
Por supuesto, también está el módulo de inspección: http://docs.python.org/library/inspect.html#module-inspect
fuente
fuente
Prueba ppretty
Salida:
fuente
Otros ya han mencionado el dir () incorporado que suena como lo que estás buscando, pero aquí hay otro buen consejo. Muchas bibliotecas, incluida la mayoría de la biblioteca estándar, se distribuyen en forma de origen. Lo que significa que puede leer fácilmente el código fuente directamente. El truco está en encontrarlo; por ejemplo:
El archivo * .pyc está compilado, por lo tanto, elimine la 'c' final y abra el archivo * .py sin compilar en su editor o visor de archivos favorito:
He encontrado esto increíblemente útil para descubrir cosas como las excepciones que se generan de una API determinada. Este tipo de detalles rara vez está bien documentado en el mundo de Python.
fuente
Si bien
pprint
otros ya lo han mencionado, me gustaría agregar algo de contexto.pprint
podría ser muy demandado por desarrolladores con experiencia en PHP que buscan una alternativa avar_dump()
.Los objetos con un atributo dict se pueden volcar muy bien usando
pprint()
mezclado convars()
, que devuelve el__dict__
atributo para un módulo, clase, instancia, etc.Entonces, no hay necesidad de un bucle .
Para volcar todas las variables contenidas en el ámbito global o local simplemente use:
locals()
muestra variables definidas en una función.También es útil acceder a funciones con su nombre correspondiente como una clave de cadena, entre otros usos :
Del mismo modo, se utiliza
dir()
para ver el contenido de un módulo o los atributos de un objeto.Y aún hay más.
fuente
Si desea ver los parámetros y métodos, como otros han señalado, puede usar
pprint
odir()
Si desea ver el valor real de los contenidos, puede hacer
object.__dict__
fuente
Dos excelentes herramientas para inspeccionar el código son:
IPython . Un terminal de Python que le permite inspeccionar usando la finalización de tabulación.
Eclipse con el complemento PyDev . Tiene un excelente depurador que le permite romper en un lugar determinado e inspeccionar objetos explorando todas las variables como un árbol. Incluso puede usar el terminal incorporado para probar el código en ese punto o escribir el objeto y presionar '.' para que le dé sugerencias de código para usted.
fuente
pprint y dir juntos funcionan muy bien
fuente
Hay una compilación de la biblioteca de código de Python solo para este propósito: inspeccionar Introducido en Python 2.7
fuente
Si está interesado en ver el código fuente de la función correspondiente al objeto
myobj
, puede escribiriPython
oJupyter Notebook
:myobj??
fuente
o
fuente
Si desea mirar dentro de un objeto vivo, entonces el
inspect
módulo de Python es una buena respuesta. En general, funciona para obtener el código fuente de las funciones que se definen en un archivo fuente en algún lugar del disco. Si desea obtener la fuente de funciones en vivo y lambdas que se definieron en el intérprete, puede usardill.source.getsource
desdedill
. También puede obtener el código de métodos y funciones de clase vinculados o no definidos definidos en curry ... sin embargo, es posible que no pueda compilar ese código sin el código del objeto adjunto.fuente
vars (obj) devuelve los atributos de un objeto.
fuente
Además, si desea mirar dentro de la lista y los diccionarios, puede usar pprint ()
fuente
Muchos buenos consejos ya, pero el más corto y fácil (no necesariamente el mejor) aún no se ha mencionado:
fuente
Intenta usar:
object
está el nombre de la variable del objeto que está intentando inspeccionar.Esto imprime una salida con formato y pestañas que muestra toda la jerarquía de claves y valores en el objeto.
NOTA: Esto funciona en python3. No estoy seguro si funciona en versiones anteriores
ACTUALIZACIÓN: Esto no funciona en todos los tipos de objetos. Si encuentra uno de esos tipos (como un objeto Request), use uno de los siguientes:
dir(object())
o
import pprint
luego:pprint.pprint(object.__dict__)
fuente