inspect
inspect - 检查活跃对象
2.1版本中的新功能。
源代码:
Lib / inspect.py
该inspect
模块提供了几个有用的功能来帮助获取有关活动对象的信息,例如模块,类,方法,函数,回溯,框架对象和代码对象。例如,它可以帮助您检查类的内容,检索方法的源代码,提取并格式化函数的参数列表,或者获取显示详细回溯所需的所有信息。
这个模块提供了四种主要的服务:类型检查,获取源代码,检查类和函数以及检查解释器堆栈。
1.类型和成员
getmembers()函数检索对象的成员,例如类或模块。 主要提供名称以“is”开头的16个函数作为getmembers()的第二个参数的方便选择。 他们还帮助您确定何时可以期望找到以下特殊属性:
类型 | 属性 | 描述 | 笔记 |
---|---|---|---|
模 | __doc__ | 文档字符串 | |
| __file__ | 文件名(内置模块缺失) | |
类 | __doc__ | 文档字符串 | |
| __module__ | 在这个类中定义的模块的名称 | |
方法 | __doc__ | 文档字符串 | |
| __name__ | 这个方法被定义的名称 | |
| im_class | 要求这种方法的类对象 | (1) |
| im_func或__func__ | 包含方法实现的函数对象 | |
| im_self或__self__ | 该方法绑定到的实例,或None | |
功能 | __doc__ | 文档字符串 | |
| __name__ | 这个函数被定义的名字 | |
| func_code | 包含已编译函数字节码的代码对象 | |
| func_defaults | 任何参数默认值的元组 | |
| func_doc | (与__doc__相同) | |
| func_globals | 在其中定义了该函数的全局名称空间 | |
| FUNC_NAME | (与__name__相同) | |
发电机 | __iter__ | 定义为支持对容器的迭代 | |
| close | 在生成器中引发新的GeneratorExit异常以终止迭代 | |
| gi_code | 代码对象 | |
| gi_frame | 框架对象或可能没有,一旦发生器已经耗尽 | |
| gi_running | 生成器正在执行时设置为1,否则为0 | |
| next | 返回容器中的下一个项目 | |
| send | 恢复生成器并“发送”一个成为当前yield-expression结果的值 | |
| throw | 用于在生成器内引发异常 | |
追溯 | tb_frame | 在这个级别的框架对象 | |
| tb_lasti | 字节码中最后一次尝试指令的索引 | |
| tb_lineno | Python源代码中的当前行号 | |
| tb_next | 下一个内部追踪对象(由此级别调用) | |
帧 | f_back | 下一个外框对象(这个框架的调用者) | |
| f_builtins | 建立了这个框架所看到的名字空间 | |
| f_code | 代码对象在这个框架中被执行 | |
| f_exc_traceback | 如果在此框架中引发了回溯,或无 | |
| f_exc_type | 在此框架中引发的异常类型,或者无 | |
| f_exc_value | 如果在此框架中引发异常值,或者无 | |
| f_globals | 全局名称空间由此框架看到 | |
| f_lasti | 字节码中最后一次尝试指令的索引 | |
| f_lineno | Python源代码中的当前行号 | |
| f_locals | 本框架所看到的本地名称空间 | |
| f_restricted | 如果帧处于受限执行模式,则为0或1 | |
| f_trace | 跟踪此帧的功能,或无 | |
码 | co_argcount | 参数数量(不包括*或**参数) | |
| co_code | 原始编译的字节码字符串 | |
| co_consts | 字节码中使用的常量元组 | |
| co_filename | 此代码对象在其中创建的文件的名称 | |
| co_firstlineno | Python源代码中的第一行数 | |
| co_flags | 位图:1 =优化| 2 = newlocals | 4 = * arg | 8 = ** ARG | |
| co_lnotab | 将行号编码为字节码索引 | |
| co_name | 这个代码对象被定义的名称 | |
| co_names | 局部变量名称的元组 | |
| co_nlocals | 局部变量的数量 | |
| co_stacksize | 所需的虚拟机堆栈空间 | |
| co_varnames | 参数名称和局部变量的元组 | |
内置 | __doc__ | 文档字符串 | |
| __name__ | 此功能或方法的原始名称 | |
| __self__ | 一个方法绑定到的实例,或None | |
注意:
- 在版本2.2中更改:
im_class
用于引用定义该方法的类。
inspect.getmembers(object[, predicate])
返回按名称排序的(名称,值)对列表中的所有对象成员。如果提供了可选谓词
参数,则只包含谓词返回真值的成员。
Note
当参数是一个类时,getmembers()不会返回元类属性(此行为是从dir()函数继承的)。
inspect.getmoduleinfo(path)
返回值的元组,如果它是模块,Python将会解释由路径标识的文件的解释方式;如果它不被标识为模块,则返回None。 返回元组是(name,suffix,mode,module_type),其中name是没有任何封装包名称的模块的名称,suffix是文件名的尾部(可能不是点分隔的扩展名) ,mode是使用的open()模式('r'或'rb'),module_type是一个给出模块类型的整数。 module_type将具有一个可以与imp模块中定义的常量进行比较的值; 有关模块类型的更多信息,请参阅该模块的文档。
在版本2.6中更改:返回一个命名的元组 ModuleInfo(name, suffix, mode, module_type)
。
inspect.getmodulename(path)
返回由文件路径
命名的模块的名称,不包括封装包的名称。这与解释器在搜索模块时使用的算法相同。如果名称不能按照解释者的规则进行匹配,则返回。None
inspect.ismodule(object)
如果对象是模块,则返回true。
inspect.isclass(object)
如果对象是一个类,无论是内置的还是用Python代码创建的,则返回true。
inspect.ismethod(object)
如果对象是使用Python编写的绑定或未绑定方法,则返回true。
inspect.isfunction(object)
如果对象是Python函数,则返回true,该函数包含由lambda表达式创建的函数。
inspect.isgeneratorfunction(object)
如果对象是Python生成器函数,则返回true。
2.6版本中的新功能。
inspect.isgenerator(object)
如果对象是一个生成器,则返回true。
2.6版本中的新功能。
inspect.istraceback(object)
如果对象是回溯,则返回true。
inspect.isframe(object)
如果对象是一个框架,则返回true。
inspect.iscode(object)
如果对象是代码,则返回true。
inspect.isbuiltin(object)
如果对象是内置函数或绑定的内置方法,则返回true。
inspect.isroutine(object)
如果对象是用户定义的或内置的函数或方法,则返回true。
inspect.isabstract(object)
如果对象是抽象基类,则返回true。
2.6版本中的新功能。
inspect.ismethoddescriptor(object)
如果对象是方法描述符,则返回true,但如果ismethod(),isclass(),isfunction()或isbuiltin()为true,则返回true。
这是Python 2.2以来的新增功能,例如,int .__ add__也是如此。 通过此测试的对象具有__get __()方法,但不包含__set __()方法,但除此之外,该组属性会有所不同。 __name__属性通常是合理的,而__doc__通常是。
通过也通过其他测试之一的描述符实现的方法从ismethoddescriptor()测试返回false,这仅仅是因为其他测试承诺更多 - 例如,当对象通过ismethod()时,您可以指望拥有im_func属性(etc)。
inspect.isdatadescriptor(object)
如果对象是数据描述符,则返回true。
数据描述符有一个__get__和一个__set__方法。 示例是属性(在Python中定义),getset和成员。 后两种是在C中定义的,并且这些类型有更多特定的测试可用,这在Python实现中是健壮的。 通常情况下,数据描述符也会有__name__和__doc__属性(属性,getset和成员都具有这两个属性),但这不能保证。
2.3版本的新功能。
inspect.isgetsetdescriptor(object)
如果对象是getset描述符,则返回true。
CPython实现细节:getsets是通过PyGetSetDef结构在扩展模块中定义的属性。 对于没有这种类型的Python实现,此方法将始终返回False。
2.5版本中的新功能。
inspect.ismemberdescriptor(object)
如果对象是成员描述符,则返回true。
CPython实现细节:成员描述符是通过PyMemberDef结构在扩展模块中定义的属性。 对于没有这种类型的Python实现,此方法将始终返回False。
2.5版本中的新功能。
2.检索源代码
inspect.getdoc(object)
获取一个对象的文档字符串,并进行清理cleandoc()
。
inspect.getcomments(object)
在单个字符串中返回紧接在对象源代码之前(对于类,函数或方法)或Python源文件顶部(如果对象是模块)的任何注释行。
inspect.getfile(object)
返回定义了对象的(文本或二进制)文件的名称。 如果对象是内置模块,类或函数,则这将失败并出现TypeError错误。
inspect.getmodule(object)
尝试猜测某个对象是在哪个模块中定义的。
inspect.getsourcefile(object)
返回定义了对象的Python源文件的名称。 如果对象是内置模块,类或函数,则这将失败并出现TypeError错误。
inspect.getsourcelines(object)
返回一个对象的源代码行和起始行号的列表。 参数可以是模块,类,方法,函数,追溯,框架或代码对象。 源代码作为与对象相对应的行列表返回,行号指示在原始源文件中找到第一行代码的位置。 如果无法检索源代码,则会引发IOError。
inspect.getsource(object)
返回一个对象的源代码文本。 参数可以是模块,类,方法,函数,追溯,框架或代码对象。 源代码作为单个字符串返回。 如果无法检索源代码,则会引发IOError。
inspect.cleandoc(doc)
清除缩排以排列代码块的文档字符串中的缩进。
从第一行删除所有主要的空白字符。任何可从第二行向前均匀删除的空白字符将被删除。随后删除开头和结尾的空行。此外,所有选项卡都扩展为空格。
2.6版本中的新功能。
3.类和功能
inspect.getclasstree(classes[, unique])
将给定的类列表排列成嵌套列表的层次结构。在出现嵌套列表的情况下,它包含从其条目紧接在列表之前的类派生的类。每个条目都是一个2元组,其中包含一个类和其基类的元组。如果唯一
参数为true,则给定列表中的每个类的返回结构中只会出现一个条目。否则,使用多重继承的类和它们的后代将多次出现。
inspect.getargspec(func)
获取Python函数参数的名称和默认值。 返回四个元组的元组:(args,varargs,关键字,默认值)。 args是参数名称的列表(它可能包含嵌套列表)。 可变参数和关键字是*和**参数的名称或无。 defaults是默认参数值的元组,或者如果没有默认参数,则为None; 如果这个元组有n个元素,它们对应于args中列出的最后n个元素。
在版本2.6中更改:返回一个命名的元组 ArgSpec(args, varargs, keywords, defaults)
。
inspect.getargvalues(frame)
获取有关传递到特定框架的参数的信息。 返回四个元组的元组:(args,varargs,关键字,本地)。 args是参数名称的列表(它可能包含嵌套列表)。 可变参数和关键字是*和**参数的名称或无。 当地人是给定框架的当地人字典。
在版本2.6中更改:返回一个命名的元组 ArgInfo(args, varargs, keywords, locals)
。
inspect.formatargspec(args[, varargs, varkw, defaults, formatarg, formatvarargs, formatvarkw, formatvalue, join])
根据返回的四个值格式化较好的参数规范getargspec()
。格式*参数是相应的可选格式函数,被称为将名称和值转换为字符串。
inspect.formatargvalues(args[, varargs, varkw, locals, formatarg, formatvarargs, formatvarkw, formatvalue, join])
根据getargvalues()返回的四个值格式化漂亮的参数规范。 格式*参数是相应的可选格式函数,被称为将名称和值转换为字符串。
inspect.getmro(cls)
以方法解析顺序返回cls基类的元组,包括cls。这个元组中不会出现多次类。请注意,方法解析顺序取决于cls的类型。除非使用非常独特的用户定义的元类型,否则cls将是元组的第一个元素。
inspect.getcallargs(func[, *args][, **kwds])
将args和kwds绑定到Python函数或方法func的参数名称,就好像它们是用它们调用的一样。 对于绑定方法,还要将第一个参数(通常命名为self)绑定到关联的实例。 将返回一个字典,将参数名称(包括*和**参数的名称,如果有的话)映射到它们的来自args和kwds的值。 在错误地调用func的情况下,即func(* args,** kwds)由于签名不兼容而引发异常时,会引发相同类型和相同或类似消息的异常。 例如:
>>> 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版本的新功能。
4.解释器堆栈
当以下函数返回“帧记录”时,每个记录都是一个包含六个项目的元组:帧对象,文件名,当前行的行号,函数名称,来自源代码的上下文行列表以及该列表中当前行的索引。
注意
保持对框架对象的引用,如框架记录的第一个元素中所记录的这些函数返回,可能会导致程序创建引用循环。一旦创建了一个引用循环,即使启用了Python的可选循环检测器,所有可以从形成循环的对象访问的所有对象的生命周期也可能变得更长。如果必须创建这样的周期,重要的是要确保它们被明确分解以避免对象的延迟破坏和增加的内存消耗。
虽然周期检测器会捕获这些,但通过删除finally
子句中的周期,可以确定帧(和局部变量)的破坏。如果在编译或使用Python时禁用循环检测器,这也很重要gc.disable()
。例如:
def handle_stackframe_without_leak():
frame = inspect.currentframe()
try:
# do something with the frame
finally:
del frame
大多数这些函数支持的可选上下文
参数指定要返回的上下文
的行数,它们以当前行为中心。
inspect.getframeinfo(frame[, context])
获取关于帧或追溯对象的信息。返回5元组,该帧的帧记录的最后五个元素。
在版本2.6中更改:返回一个命名的元组 Traceback(filename, lineno, function, code_context, index)
。
inspect.getouterframes(frame[, context])
获取一个帧
和所有外部帧
的帧
记录列表。这些框架
表示导致创建框架
的调用。返回列表中的第一个条目表示框架
; 最后一个条目表示帧
的最外层调用。
inspect.getinnerframes(traceback[, context])
获取追踪帧
和所有内部帧
的帧
记录列表。这些帧
表示由于帧
而产生的呼叫。列表中的第一个条目表示回溯
; 最后一个条目表示引发异常的位置。
inspect.currentframe()
返回调用者的堆栈帧的帧对象。
CPython实现细节:
该函数依赖于解释器中的Python堆栈框架支持,但不能保证在所有Python实现中都存在。如果在没有Python堆栈框架支持的实现中运行,则此函数返回None
。
inspect.stack([context])
返回调用者堆栈的帧记录列表。返回列表中的第一个条目表示调用者; 最后一个条目代表堆叠上最外面的呼叫。
inspect.trace([context])
返回当前帧和引发当前正在处理的异常的帧之间堆栈的帧记录列表。列表中的第一个条目表示调用者; 最后一个条目表示引发异常的位置。