如何查看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模块进行下面的对象自省。

objbrowserscreenshot

 """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 ) 

如果你想看参数和方法,正如其他人指出的,你可以使用pprintdir()

如果你想看到内容的实际价值,你可以做

object.__dict__

两种检查代码的好工具是:

  1. IPython 。 一个Pythonterminal,允许你检查使用标签完成。

  2. 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()