¿Cómo miro dentro de un objeto de Python?

5 minutos de lectura

avatar de usuario
pequeñojim84

Estoy empezando a codificar en varios proyectos usando Python (incluido el desarrollo web de Django y el desarrollo de juegos Panda3D).

Para ayudarme a entender lo que está pasando, básicamente me gustaría ‘mirar’ dentro de los objetos de Python para ver cómo funcionan, como sus métodos y propiedades.

Digamos que tengo un objeto de Python, ¿qué necesitaría para imprimir su contenido? ¿Es eso posible?

avatar de usuario
Brandon Taylor

Python tiene un sólido conjunto de características de introspección.

Echa un vistazo a lo siguiente funciones integradas:

type() y dir() son particularmente útiles para inspeccionar el tipo de un objeto y su conjunto de atributos, respectivamente.

  • No sabía que el término era ‘introspección’. ¡Es una gran ayuda! Así como todas las funciones que me has dado… ¡Gracias!

    – littlejim84

    17 de junio de 2009 a las 13:02

  • property, classmethod y staticmethod no están relacionados con la introspección. Todos estos métodos crean tipos especiales de objetos que se pueden usar para definir clases con un comportamiento especial, pero no son de ayuda para inspeccionar esas clases o construcciones.

    – Eliminación de negación simple

    18 de junio de 2009 a las 0:21

  • La respuesta de @Brian a continuación le muestra cómo ver también el código fuente de varios objetos de python desde dentro de python. Eso es lo que estaba buscando originalmente y estoy seguro de que no estaré solo. (Podría valer la pena incluir una referencia a su respuesta en esta respuesta, ya que es la más aceptada).

    – miguelavila

    24 de febrero de 2012 a las 19:24

  • Creo que es una mala respuesta. en lugar de darnos una solución, simplemente nos da todo lo relacionado con eso en la documentación

    –Ishan Srivastava

    29 de diciembre de 2017 a las 0:42

  • @IshanSrivastava tenía razón. Se supone que no debe proporcionar enlaces a las respuestas, se supone que debe proporcionar respuestas.

    – John Smith

    23 de julio de 2021 a las 8:36

object.__dict__

  • vars(object) esta hecho para eso.

    – liberforce

    18 de febrero de 2019 a las 15:05

  • Realmente from pprint import pprint; pprint(vars(object)) me dio una muy buena vista sobre el contenido de mi objeto. Gracias @liberforce

    – N. Maks

    13 de mayo de 2019 a las 7:00


  • la mejor manera de ver el objeto y su contenido en una cadena

    -Peter Krauss

    28 de diciembre de 2019 a las 21:57

  • Esta es una excelente manera de ver objetos que implementan cualquier método de representación, u objetos como googleapiclient.errors.HttpError que, cuando los imprime, imprimen información insuficiente con seguridad, gracias @ mtasic85

    – Felipe Valdés

    3 de febrero de 2020 a las 12:44

¡Me sorprende que nadie haya mencionado ayuda todavía!

In [1]: def foo():
   ...:     "foo!"
   ...:

In [2]: help(foo)
Help on function foo in module __main__:

foo()
    foo!

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.

  • Luego usa las otras técnicas mencionadas aquí. Pero si la cadena de documentación está disponible, considéralo canon.

    –Edward Falk

    30 sep 2019 a las 21:11

  • No estoy seguro de si Python actualizó esta función en los últimos años, pero “help(object_name)” brinda una descripción completa en un formato altamente estructurado. Es un guardián. Gracias.

    – Brian Cugelmann

    11 de mayo de 2020 a las 5:25

Primero, lee la fuente.

En segundo lugar, utilice el dir() función.

avatar de usuario
Brian

Si esto es para exploración para ver qué está pasando, recomendaría mirar IPython. Esto agrega varios accesos directos para obtener la documentación de los objetos, las propiedades e incluso el código fuente. Por ejemplo, agregar un “?” a una función dará la ayuda para el objeto (efectivamente un atajo para “ayuda(obj)”, mientras que usando dos?’s (“func??“) mostrará el código fuente si está disponible.

También hay muchas comodidades adicionales, como completar tabuladores, impresión bonita de resultados, historial de resultados, etc. que lo hacen muy útil para este tipo de programación exploratoria.

Para un uso más programático de la introspección, los componentes básicos como dir(), vars(), getattr etc será útil, pero vale la pena su tiempo para comprobar el inspeccionar módulo. Para obtener la fuente de una función, use “inspect.getsource“por ejemplo, aplicándolo a sí mismo:

>>> print inspect.getsource(inspect.getsource)
def getsource(object):
    """Return the text of the source code for an object.

    The argument may be a module, class, method, function, traceback, frame,
    or code object.  The source code is returned as a single string.  An
    IOError is raised if the source code cannot be retrieved."""
    lines, lnum = getsourcelines(object)
    return string.join(lines, '')

inspect.getargspec también suele ser útil si se trata de envolver o manipular funciones, ya que proporcionará los nombres y valores predeterminados de los parámetros de la función.

avatar de usuario
titusjan

Si está interesado en una GUI para esto, eche un vistazo a navegador obj. Utiliza el módulo de inspección de la biblioteca estándar de Python para la introspección de objetos debajo.

objbrowsercaptura de pantalla

avatar de usuario
Bayer

Puede enumerar los atributos de un objeto con dir() en el shell:

>>> dir(object())
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

Por supuesto, también está el módulo de inspección: http://docs.python.org/library/inspect.html#module-inspect

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad