lit*_*m84 266 python introspection
我开始使用Python编写各种项目代码(包括Django Web开发和Panda3D游戏开发).
为了帮助我理解正在发生的事情,我想基本上"查看"Python对象内部以查看它们如何勾选 - 就像它们的方法和属性一样.
所以说我有一个Python对象,我需要打印出它的内容?这甚至可能吗?
mta*_*c85 163
object.__dict__
S.L*_*ott 60
首先,阅读来源.
其次,使用该dir()
功能.
Jas*_*ker 53
我很惊讶没有人提到帮助!
In [1]: def foo():
...: "foo!"
...:
In [2]: help(foo)
Help on function foo in module __main__:
foo()
foo!
Run Code Online (Sandbox Code Playgroud)
帮助让您阅读文档字符串并了解类可能具有的属性,这非常有用.
Bri*_*ian 27
如果这是为了探索发生了什么,我建议看看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, '')
Run Code Online (Sandbox Code Playgroud)
inspect.getargspec
如果你正在处理包装或操作函数,它也经常有用,因为它将给出函数参数的名称和默认值.
您可以在shell中列出具有dir()的对象的属性:
>>> dir(object())
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
Run Code Online (Sandbox Code Playgroud)
当然,还有检查模块:http://docs.python.org/library/inspect.html#module-inspect
有一个非常酷的工具,叫做objexplore
. 这是一个关于如何explore
在 pandas DataFrame 上使用其函数的简单示例。
import pandas as pd
df=pd.read_csv('https://storage.googleapis.com/download.tensorflow.org/data/heart.csv')
from objexplore import explore
explore(df)
Run Code Online (Sandbox Code Playgroud)
"""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__
Run Code Online (Sandbox Code Playgroud)
其他人已经提到了内置的dir()听起来像你正在寻找的,但这是另一个好的提示.许多库 - 包括大多数标准库 - 以源代码形式分发.这意味着你可以很容易地直接阅读源代码.诀窍是找到它; 例如:
>>> import string
>>> string.__file__
'/usr/lib/python2.5/string.pyc'
Run Code Online (Sandbox Code Playgroud)
编译*.pyc文件,因此删除尾随的'c'并在您喜欢的编辑器或文件查看器中打开未编译的*.py文件:
/usr/lib/python2.5/string.py
Run Code Online (Sandbox Code Playgroud)
我发现这非常有用,可以发现从给定的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)
Run Code Online (Sandbox Code Playgroud)
输出:
__main__.A at 0x1debd68L (
_p = 8,
foo = [0, 1, 2, ..., 7, 8, 9],
s = 5
)
Run Code Online (Sandbox Code Playgroud)
虽然pprint
其他人已经提到过,但我想添加一些背景信息.
pprint模块提供了一种"漂亮打印"任意Python数据结构的功能,该形式可用作解释器的输入.如果格式化结构包含非基本Python类型的对象,则表示可能无法加载.如果包含诸如文件,套接字,类或实例之类的对象,以及许多其他不能表示为Python常量的内置对象,则可能出现这种情况.
pprint
可能是具有PHP背景的开发人员的高需求,他们正在寻找替代方案var_dump()
.
具有dict属性的对象可以使用pprint()
mixed with 很好地转储vars()
,它返回__dict__
模块,类,实例等的属性:
from pprint import pprint
pprint(vars(your_object))
Run Code Online (Sandbox Code Playgroud)
所以,不需要循环.
要转储全局或局部范围中包含的所有变量,只需使用:
pprint(globals())
pprint(locals())
Run Code Online (Sandbox Code Playgroud)
locals()
显示函数中定义的变量.
除了其他用法之外,访问具有相应名称作为字符串键的函数也很有用:
locals()['foo']() # foo()
globals()['foo']() # foo()
Run Code Online (Sandbox Code Playgroud)
同样,dir()
用于查看模块的内容或对象的属性.
而且还有更多.
归档时间: |
|
查看次数: |
280844 次 |
最近记录: |