Как я могу заглянуть внутрь объекта Python?

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

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

Так сказать, у меня есть объект Python, что мне нужно, чтобы распечатать его содержимое? Возможно ли это?

Ответ 2

object.__dict__

Ответ 3

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

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

Ответ 4

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

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

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

foo()
    foo!

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

Ответ 5

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

Ответ 6

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

objbrowserscreenshot

Ответ 7

"""Visit http://diveintopython.net/"""

__author__ = "Mark Pilgrim ([email protected])"


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__

Ответ 8

Вы можете указать атрибуты объекта с 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

Ответ 9

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

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

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

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

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

Ответ 10

Попробуйте 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
)

Ответ 11

Если вы хотите посмотреть параметры и методы, как указывали другие, вы можете использовать pprint или dir()

Если вы хотите увидеть фактическое значение содержимого, вы можете сделать

object.__dict__

Ответ 12

Два замечательных инструментария для проверки кода:

  • IPython. Терминал python, который позволяет вам проверять использование табуляции.

  • Eclipse с плагин PyDev. Он имеет отличный отладчик, который позволяет вам разбиться на заданное место и проверять объекты, просматривая все переменные как дерево. Вы даже можете использовать встроенный терминал, чтобы попробовать код в этом месте или набрать объект и нажать ".". чтобы он дал подсказки для вас.

введите описание изображения здесь

Ответ 13

pprint и dir вместе работают отлично

Ответ 14

Для этой цели существует сборка библиотеки кода python: inspect Представлено в Python 2.7

Ответ 15

Если вы хотите заглянуть внутрь живого объекта, тогда хороший модуль python inspect. В общем, он работает для получения исходного кода функций, определенных в исходном файле где-то на диске. Если вы хотите получить источник живых функций и лямбда, которые были определены в интерпретаторе, вы можете использовать dill.source.getsource из dill. Он также может получить код для связанных или несвязанных методов и функций класса, определенных в карри... однако вы не сможете скомпилировать этот код без прилагаемого объектного кода.

>>> from dill.source import getsource
>>> 
>>> def add(x,y):
...   return x+y
... 
>>> squared = lambda x:x**2
>>> 
>>> print getsource(add)
def add(x,y):
  return x+y

>>> print getsource(squared)
squared = lambda x:x**2

>>> 
>>> class Foo(object):
...   def bar(self, x):
...     return x*x+x
... 
>>> f = Foo()
>>> 
>>> print getsource(f.bar)
def bar(self, x):
    return x*x+x

>>> 

Ответ 16

Кроме того, если вы хотите просмотреть список и словари, вы можете использовать pprint()

Ответ 17

vars (obj) возвращает атрибуты объекта.