28.13. 检查—检查活动对象

2.1 版中的新Function。

源代码: Lib/inspect.py


inspect模块提供了几个有用的Function,以帮助获取有关活动对象的信息,例如模块,类,方法,函数,回溯,框架对象和代码对象。例如,它可以帮助您检查类的内容,检索方法的源代码,提取函数的参数列表并设置其格式或获取显示详细回溯所需的所有信息。

该模块提供四种主要服务:类型检查,获取源代码,检查类和函数以及检查解释器堆栈。

28.13.1. 类型和成员

getmembers()函数检索对象的成员,例如类或模块。名称以“ is”开头的 16 个函数主要是为getmembers()的第二个参数提供方便的选择。它们还帮助您确定何时可以期望找到以下特殊属性:

Type Attribute Description Notes
module doc documentation string
file 文件名(内置模块缺失)
class doc documentation string
module 定义此类的模块的名称
method doc documentation string
name 定义此方法的名称
im_class 要求此方法的类对象 (1)
im_func 或__func__ 函数对象,包含方法的实现
im_self 或__self__ 此方法绑定到的实例,或None
function doc documentation string
name 定义此Function的名称
func_code 包含已编译函数bytecode的代码对象
func_defaults 参数的任何默认值的 Tuples
func_doc (与__doc_相同)
func_globals 定义此Function的全局名称空间
func_name (与__name_相同)
generator iter 定义为支持容器上的迭代
close 在生成器内部引发新的 GeneratorExit 异常以终止迭代
gi_code code object
gi_frame 框架对象或 Generator 耗尽后可能为None
gi_running 生成器执行时设置为 1,否则设置为 0
next 从容器返回下一个项目
send 恢复生成器并“发送”一个值,该值成为当前 yield-expression 的结果
throw 用于在生成器内部引发异常
traceback tb_frame 在此级别上框架对象
tb_lasti 字节码中最后try执行的指令的索引
tb_lineno Python 源代码中的当前行号
tb_next 下一个内部回溯对象(由该级别调用)
frame f_back 下一个外部框架对象(此框架的调用者)
f_builtins 此框架看到的内建名称空间
f_code 在此框架中执行的代码对象
f_exc_traceback 回溯(如果在此框架中引发),或None
f_exc_type 异常类型(如果在此框架中引发),或None
f_exc_value 异常值(如果在此框架中引发),或None
f_globals 此框架看到的全局名称空间
f_lasti 字节码中最后try执行的指令的索引
f_lineno Python 源代码中的当前行号
f_locals 此框架看到的本地名称空间
f_restricted 0 或 1(如果框架处于受限执行模式)
f_trace 此框架或None的跟踪Function
code co_argcount 参数数量(不包括*或**参数)
co_code 原始编译字节码的字符串
co_consts 字节码中使用的常量 Tuples
co_filename 在其中创建此代码对象的文件的名称
co_firstlineno Python 源代码中第一行的数量
co_flags 位图:1 =优化的| 2 = newlocals | 4 = * arg | 8 = ** arg
co_lnotab 行号到字节码索引的编码 Map
co_name 定义此代码对象的名称
co_names 局部变量名称的 Tuples
co_nlocals 局部变量数
co_stacksize 所需的虚拟机堆栈空间
co_varnames 参数和局部变量名称的 Tuples
builtin doc documentation string
name 该函数或方法的原始名称
self 方法绑定到的实例,或None

Note:

Note

当参数为类时,getmembers()不返回元类属性(此行为是从dir()函数继承的)。

在 2.6 版中更改:返回named tuple ModuleInfo(name, suffix, mode, module_type)

2.6 版的新Function。

2.6 版的新Function。

2.6 版的新Function。

这是从 Python 2.2 开始的新Function,例如int.__add__就是如此。pass此测试的对象具有get()方法,但没有set()方法,但除此之外,属性集有所不同。 name属性通常是明智的,而__doc__通常是明智的。

pass Descriptors 实现的方法也pass其他测试之一,则从ismethoddescriptor()测试返回 false,仅是因为其他测试承诺了更多–例如,当对象passismethod()时,您可以指望拥有im_func属性(等)。

数据 Descriptors 同时具有getset方法。示例包括属性(在 Python 中定义),getset 和成员。后两者是用 C 定义的,并且有针对这些类型的更具体的测试,这些测试在 Python 实现中非常可靠。通常,数据 Descriptors 还将具有name__doc__属性(属性,getset 和成员都具有这两个属性),但这不能保证。

2.3 版的新Function。

CPython 实现细节: getset 是在扩展模块中passPyGetSetDef结构定义的属性。对于没有此类类型的 Python 实现,此方法将始终返回False

2.5 版的新Function。

CPython 实现细节: 成员 Descriptors 是在扩展模块中passPyMemberDef结构定义的属性。对于没有此类类型的 Python 实现,此方法将始终返回False

2.5 版的新Function。

28.13.2. 检索源代码

从第一行删除所有前导空格。可以从第二行开始均匀删除的所有前导空格都将被删除。随后删除开头和结尾的空行。此外,所有选项卡都将扩展为空格。

2.6 版的新Function。

28.13.3. 类和Function

在 2.6 版中更改:返回named tuple ArgSpec(args, varargs, keywords, defaults)

在 2.6 版中更改:返回named tuple ArgInfo(args, varargs, keywords, locals)

>>> from inspect import getcallargs
>>> def f(a, b=1, *pos, **named):
...     pass
>>> getcallargs(f, 1, 2, 3)
{'a': 1, 'named': {}, 'b': 2, 'pos': (3,)}
>>> getcallargs(f, a=2, x=4)
{'a': 2, 'named': {'x': 4}, 'b': 1, 'pos': ()}
>>> getcallargs(f)
Traceback (most recent call last):
...
TypeError: f() takes at least 1 argument (0 given)

2.7 版的新Function。

28.13.4. 解释器堆栈

当以下函数返回“框架记录”时,每个记录都是六个项的 Tuples:框架对象,文件名,当前行的行号,函数名称,源代码中的上下文行列表,以及该列表中当前行的索引。

Note

在框架的第一个元素中记录到这些函数返回的内容时,保留对框架对象的引用可能会导致程序创建引用循环。创建参考循环后,即使启用了 Python 的可选循环检测器,也可以从构成循环的对象访问的所有对象的寿命变得更长。如果必须创建这样的循环,则重要的是要确保将其明确断开,以避免延迟破坏对象和增加内存消耗。

尽管循环检测器将捕获这些错误,但是可以pass删除finally子句中的循环来确定是否破坏了帧(和局部变量)。如果在编译 Python 或使用gc.disable()时禁用了循环检测器,这也很重要。例如:

def handle_stackframe_without_leak():
frame = inspect.currentframe()
try:
# do something with the frame
finally:
del frame

大多数这些函数支持的可选* context *参数指定要返回的上下文行数,该行以当前行为中心。

在 2.6 版中更改:返回named tuple Traceback(filename, lineno, function, code_context, index)

CPython 实现细节: 此函数依赖于解释器中的 Python 堆栈框架支持,并不能保证在所有 Python 实现中都存在。如果在没有 Python 堆栈框架支持的实现中运行,则此函数返回None

首页