我开始使用Python在各种项目中进行编码(包括Django Web开发和Panda3D游戏开发)。
为了帮助我理解发生了什么,我想基本上在Python对象内部“看”看它们如何打勾-像它们的方法和属性一样。
假设我有一个Python对象,我需要打印出什么内容?那有可能吗?
我开始使用Python在各种项目中进行编码(包括Django Web开发和Panda3D游戏开发)。
为了帮助我理解发生了什么,我想基本上在Python对象内部“看”看它们如何打勾-像它们的方法和属性一样。
假设我有一个Python对象,我需要打印出什么内容?那有可能吗?
Answers:
object.__dict__
vars(object)
为此。
from pprint import pprint; pprint(vars(object))
,我对对象的内容有了很好的了解。感谢@liberforce
首先,阅读源代码。
其次,使用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模块对下面的对象进行自省。
您可以在外壳程序中使用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__
尝试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
)
其他人已经提到了dir()内置函数,听起来像您要找的东西,但这是另一个好技巧。许多库(包括大多数标准库)都以源代码形式分发。这意味着您可以轻松地直接阅读源代码。诀窍在于找到它;例如:
>>> import string
>>> string.__file__
'/usr/lib/python2.5/string.pyc'
* .pyc文件已编译,因此请删除结尾的“ c”并在您喜欢的编辑器或文件查看器中打开未编译的* .py文件:
/usr/lib/python2.5/string.py
我发现这对于发现诸如从给定API引发哪些异常之类的事情非常有用。这种细节很少在Python世界中有充分的文献记载。
尽管pprint
其他人已经提到过,但我想添加一些上下文。
pprint模块提供了一种以可以用作解释器输入的形式“漂亮地打印”任意Python数据结构的功能。如果格式化的结构包含不是基本Python类型的对象,则表示可能无法加载。如果包括文件,套接字,类或实例之类的对象,以及许多其他无法用Python常量表示的内置对象,则可能是这种情况。
pprint
寻找PHP替代方案的具有PHP背景的开发人员可能需求很高 var_dump()
。
带有dict属性的对象可以很好地pprint()
与混合使用来转储vars()
,它返回__dict__
模块,类,实例等的属性:
from pprint import pprint
pprint(vars(your_object))
因此,不需要循环。
要转储全局或局部作用域中包含的所有变量,只需使用:
pprint(globals())
pprint(locals())
locals()
显示函数中定义的变量。
这也是有用的与他们对应的名字作为一个字符串键,其中接入功能的其他用途:
locals()['foo']() # foo()
globals()['foo']() # foo()
同样,dir()
用于查看模块的内容或对象的属性。
还有更多。
正如其他人指出的那样,如果您要查看参数和方法,则可以使用pprint
或dir()
如果要查看内容的实际值,可以执行
object.__dict__
如果要查看活动对象内部,则python的inspect
模块是一个很好的答案。通常,它用于获取在磁盘上某处的源文件中定义的功能的源代码。如果要获取解释器中定义的实时函数和lambda的来源,则可以使用dill.source.getsource
from 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
>>>
vars(obj)返回对象的属性。
尝试使用:
print(object.stringify())
object
您要检查的对象的变量名在哪里。这会打印出格式正确的选项卡式输出,显示对象中所有键和值的层次结构。
注意:这在python3中有效。不知道它是否可以在早期版本中使用
更新:这不适用于所有类型的对象。如果遇到这些类型之一(例如Request对象),请改用以下一种方法:
dir(object())
要么
import pprint
然后:
pprint.pprint(object.__dict__)