如何查看Python对象?
我开始使用Python编写各种项目(包括Django网页开发和Panda3D游戏开发)。
为了帮助我理解正在发生的事情,我想基本上看看Python对象的内容,看看它们是如何打勾的 – 就像它们的方法和属性一样。
所以说我有一个Python对象,我需要打印出它的内容? 这甚至可能吗?
Python有一套强大的内省function。
看看下面的内置函数 :
- types()
- DIR()
- ID()
- GETATTR()
- hasattr()
- 全局()
- 当地人()
- 调用()
type()和dir()对于分别检查一个对象的types和它的一组属性特别有用。
object.__dict__
首先阅读来源。
其次,使用dir()
函数。
我很惊讶没有人提到的帮助呢!
In [1]: def foo(): ...: "foo!" ...: In [2]: help(foo) Help on function foo in module __main__: foo() foo!
帮助可以让你阅读文档string,并了解一个类可能具有的属性,这是非常有帮助的。
如果这是为了看看发生了什么,我build议看看IPython 。 这增加了各种快捷方式来获取对象文档,属性,甚至源代码。 比如追加一个“?” 到一个函数会给对象的帮助(实际上是一个“help(obj)”的快捷方式,如果可用的话使用两个?(“ func??
”)将显示源代码。
还有很多额外的便利,比如制表符完成,结果打印,结果历史logging等等,这使得这种探索性编程非常方便。
为了更多地使用内省,像dir()
, vars()
, getattr
等基本的内build函数将会很有用,但是非常值得您花时间检查一下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标准库中的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__
您可以在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
其他人已经提到了内置的dir(),这听起来像你正在寻找,但这里是另一个好的提示。 许多图书馆 – 包括大部分的标准图书馆 – 都以原始forms分发。 这意味着你可以很容易地直接阅读源代码。 诀窍在于find它; 例如:
>>> import string >>> string.__file__ '/usr/lib/python2.5/string.pyc'
编译* .pyc文件,所以删除尾部的'c'并打开你喜欢的编辑器或文件查看器中的未编译的* .py文件:
/usr/lib/python2.5/string.py
我发现这非常有用,用于发现从给定API引发exception的东西。 这种细节在Python世界中很less有文档记载。
尝试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 。 一个Pythonterminal,允许你检查使用标签完成。
-
Eclipse与PyDev插件 。 它有一个非常出色的debugging器,可以让你在给定的位置打断并通过浏览所有的variables来检查对象。 您甚至可以使用embedded式terminal在该位置尝试编码或键入对象并按“。”。 让它给你提供代码提示。
pprint和dir一起工作很好
有一个Python代码库只是为了这个目的而构build的: inspect在Python 2.7中引入
如果你想看一个活的对象,那么python的inspect
模块是一个很好的答案。 一般来说,它用于获取源文件中定义的函数的源代码。 如果你想获得在解释器中定义的活动函数和lambdaexpression式的源,你可以使用dill.source.getsource
。 它也可以从curries中定义的绑定或非绑定类方法和函数获取代码…但是,如果没有包含对象的代码,您可能无法编译该代码。
>>> 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()