Ответ 1
Python обладает мощным набором функций самоанализа.
Взгляните на следующие встроенные функции:
type()
и dir()
особенно полезны для проверки типа объекта и его набора атрибутов соответственно.
Я начинаю кодировать в различных проектах, используя Python (включая разработку веб-сайта Django и разработку игры Panda3D).
Чтобы помочь мне понять, что происходит, я хотел бы в основном "посмотреть" внутри объектов Python, чтобы увидеть, как они тикают - как их методы и свойства.
Так сказать, у меня есть объект Python, что мне нужно, чтобы распечатать его содержимое? Возможно ли это?
Python обладает мощным набором функций самоанализа.
Взгляните на следующие встроенные функции:
type()
и dir()
особенно полезны для проверки типа объекта и его набора атрибутов соответственно.
object.__dict__
Сначала прочитайте источник.
Во-вторых, используйте функцию dir()
.
Я удивлен, что никто не упомянул о помощи!
In [1]: def foo():
...: "foo!"
...:
In [2]: help(foo)
Help on function foo in module __main__:
foo()
foo!
Справка позволяет читать docstring и получать представление о том, какие атрибуты может иметь класс, что очень полезно.
Если это исследование, чтобы узнать, что происходит, я бы рекомендовал посмотреть 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
также часто полезен, если вы имеете дело с обертыванием или манипуляцией функциями, так как он будет давать имена и значения по умолчанию для параметров функции.
Если вам интересен GUI для этого, посмотрите objbrowser. Он использует модуль проверки из стандартной библиотеки Python для интроспекции объекта под ним.
"""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__
Вы можете указать атрибуты объекта с 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
Другие уже упомянули встроенный dir(), который звучит как то, что вы ищете, но вот еще один хороший совет. Многие библиотеки, включая большую часть стандартной библиотеки, распространяются в исходной форме. Это означает, что вы можете легко прочитать исходный код напрямую. Фокус в том, чтобы найти его; например:
>>> import string
>>> string.__file__
'/usr/lib/python2.5/string.pyc'
Файл *.pyc скомпилирован, поэтому удалите конечный 'c' и откройте файл uncompiled *.py в вашем любимом редакторе или просмотрщике файлов:
/usr/lib/python2.5/string.py
Я нашел это невероятно полезным для обнаружения таких вещей, как исключения из данного API. Этот вид деталей редко хорошо документирован в мире Python.
Попробуйте 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
)
Если вы хотите посмотреть параметры и методы, как указывали другие, вы можете использовать pprint
или dir()
Если вы хотите увидеть фактическое значение содержимого, вы можете сделать
object.__dict__
Два замечательных инструментария для проверки кода:
IPython. Терминал python, который позволяет вам проверять использование табуляции.
Eclipse с плагин PyDev. Он имеет отличный отладчик, который позволяет вам разбиться на заданное место и проверять объекты, просматривая все переменные как дерево. Вы даже можете использовать встроенный терминал, чтобы попробовать код в этом месте или набрать объект и нажать ".". чтобы он дал подсказки для вас.
pprint и dir вместе работают отлично
Для этой цели существует сборка библиотеки кода python: inspect Представлено в Python 2.7
Если вы хотите заглянуть внутрь живого объекта, тогда хороший модуль 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
>>>
Кроме того, если вы хотите просмотреть список и словари, вы можете использовать pprint()
vars (obj) возвращает атрибуты объекта.