我开始使用Python编写各种项目代码(包括Django Web开发和Panda3D游戏开发).
为了帮助我理解正在发生的事情,我想基本上"查看"Python对象内部以查看它们如何勾选 - 就像它们的方法和属性一样.
所以说我有一个Python对象,我需要打印出它的内容?这甚至可能吗?
Python有一套强大的内省功能.
看看以下内置函数:
type()
dir()
id()
getattr()
hasattr()
globals()
locals()
callable()
type()
并且dir()
分别对于检查对象的类型及其属性集特别有用.
object.__dict__
首先,阅读来源.
其次,使用该dir()
功能.
我很惊讶没有人提到帮助!
In [1]: def foo(): ...: "foo!" ...: In [2]: help(foo) Help on function foo in module __main__: foo() foo!
帮助让您阅读文档字符串并了解类可能具有的属性,这非常有用.
如果这是为了探索发生了什么,我建议看看IPython.这会添加各种快捷方式来获取对象文档,属性甚至源代码.例如附加"?" 函数将为对象提供帮助(实际上是"help(obj)"的快捷方式,使用两个?'(" func??
")的时候会显示源代码(如果可用).
还有许多额外的便利,例如标签完成,结果的漂亮打印,结果历史等,这使得这种探索性编程非常方便.
欲了解更多程序中使用内省的,像基本建宏dir()
,vars()
,getattr
等将是有益的,但它是值得你花时间检查出的检查模块.要获取函数的源,请使用" 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标准库中的inspect模块进行下面的对象内省.
您可以在shell中列出具有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
"""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__
其他人已经提到了内置的dir()听起来像你正在寻找的,但这是另一个好的提示.许多库 - 包括大多数标准库 - 以源代码形式分发.这意味着你可以很容易地直接阅读源代码.诀窍是找到它; 例如:
>>> import string >>> string.__file__ '/usr/lib/python2.5/string.pyc'
编译*.pyc文件,因此删除尾随的'c'并在您喜欢的编辑器或文件查看器中打开未编译的*.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
其他人已经提到过,但我想添加一些背景信息.
pprint模块提供了一种"漂亮打印"任意Python数据结构的功能,该形式可用作解释器的输入.如果格式化结构包含非基本Python类型的对象,则表示可能无法加载.如果包含诸如文件,套接字,类或实例之类的对象,以及许多其他不能表示为Python常量的内置对象,则可能出现这种情况.
pprint
可能是具有PHP背景的开发人员的高需求,他们正在寻找替代方案var_dump()
.
具有dict属性的对象可以使用pprint()
mixed with 很好地转储vars()
,它返回__dict__
模块,类,实例等的属性:
from pprint import pprint pprint(vars(your_object))
所以,不需要循环.
要转储全局或局部范围中包含的所有变量,只需使用:
pprint(globals()) pprint(locals())
locals()
显示函数中定义的变量.
除了其他用法之外,访问具有相应名称作为字符串键的函数也很有用:
locals()['foo']() # foo() globals()['foo']() # foo()
同样,dir()
用于查看模块的内容或对象的属性.
而且还有更多.