Как мне заглянуть внутрь объекта Python? - PullRequest
241 голосов
/ 17 июня 2009

Я начинаю кодировать в различных проектах с использованием Python (включая веб-разработку Django и разработку игр Panda3D).

Чтобы помочь мне понять, что происходит, я хотел бы в основном «посмотреть» внутри объектов Python, чтобы увидеть, как они помечаются - как их методы и свойства.

Итак, скажем, у меня есть объект Python, что мне нужно, чтобы распечатать его содержимое? Это вообще возможно?

Ответы [ 21 ]

294 голосов
/ 17 июня 2009

Python обладает мощным набором функций для самоанализа.

Взгляните на следующие встроенные функции :

type() и dir() особенно полезны для проверки типа объекта и его набора атрибутов соответственно.

155 голосов
/ 17 июня 2009

object.__dict__

59 голосов
/ 17 июня 2009

Сначала прочитайте источник.

Во-вторых, используйте функцию dir().

50 голосов
/ 18 июня 2009

Я удивлен, что никто еще не упомянул помощь!

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

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

foo()
    foo!

Справка позволяет прочитать строку документации и получить представление о том, какие атрибуты может иметь класс, что очень полезно.

26 голосов
/ 17 июня 2009

Если это для исследования, чтобы увидеть, что происходит, я бы рекомендовал посмотреть IPython . Это добавляет различные ярлыки для получения объектов документации, свойств и даже исходного кода. Например, добавив "?" функция выдаст справку для объекта (по сути, это ярлык для «help (obj)», при использовании двух? («func??») будет отображаться исходный код, если он доступен.

Существует также множество дополнительных удобств, таких как завершение табуляции, удобная печать результатов, история результатов и т. Д., Которые делают его очень удобным для такого рода исследовательского программирования.

Для более программного использования интроспекции будут полезны базовые встроенные функции, такие как dir(), vars(), getattr и т. Д., Но стоит потратить время на ознакомление с модулем inspect . Чтобы получить источник функции, используйте «inspect.getsource», например, применив ее к себе:

>>> 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 также часто полезен, если вы имеете дело с обертыванием или манипулированием функциями, поскольку он даст имена и значения по умолчанию параметров функции.

14 голосов
/ 18 апреля 2014

Если вам нужен графический интерфейс для этого, взгляните на objbrowser . Он использует модуль проверки из стандартной библиотеки Python для самоанализа объекта под ним.

objbrowserscreenshot

7 голосов
/ 28 июля 2016

Попробуйте ppretty

from ppretty import ppretty


class A(object):
    s = 5

    def __init__(self):
        self._p = 8

    @property
    def foo(self):
        return range(10)


print ppretty(A(), indent='    ', depth=2, width=30, seq_length=6,
              show_protected=True, show_private=False, show_static=True,
              show_properties=True, show_address=True)

Выход:

__main__.A at 0x1debd68L (
    _p = 8, 
    foo = [0, 1, 2, ..., 7, 8, 9], 
    s = 5
)
7 голосов
/ 17 июня 2009

Вы можете перечислить атрибуты объекта с помощью dir () в оболочке:

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

Конечно, есть также модуль проверки: http://docs.python.org/library/inspect.html#module-inspect

7 голосов
/ 18 июня 2009

Другие уже упоминали встроенную функцию dir (), которая звучит как то, что вы ищете, но вот еще один хороший совет. Многие библиотеки - в том числе большая часть стандартной библиотеки - распространяются в виде исходного кода. Это означает, что вы можете довольно легко прочитать исходный код напрямую. Хитрость в том, чтобы найти это; например:

>>> import string
>>> string.__file__
'/usr/lib/python2.5/string.pyc'

Файл * .pyc скомпилирован, поэтому удалите завершающий символ 'c' и откройте не скомпилированный файл * .py в вашем любимом редакторе или средстве просмотра файлов:

/usr/lib/python2.5/string.py

Я обнаружил, что это невероятно полезно для обнаружения таких вещей, как исключения, возникающие из данного API. Подобные детали редко документируются в мире Python.

7 голосов
/ 17 июня 2009
"""Visit http://diveintopython.net/"""

__author__ = "Mark Pilgrim (mark@diveintopython.org)"


def info(object, spacing=10, collapse=1):
    """Print methods and doc strings.

    Takes module, class, list, dictionary, or string."""
    methodList = [e for e in dir(object) if callable(getattr(object, e))]
    processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
    print "\n".join(["%s %s" %
                     (method.ljust(spacing),
                      processFunc(str(getattr(object, method).__doc__)))
                     for method in methodList])

if __name__ == "__main__":
    print help.__doc__
...