首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

注意:

  1. 在版本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)由于签名不兼容而引发异常时,会引发相同类型和相同或类似消息的异常。 例如:

代码语言:javascript
复制
>>> 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()。例如:

代码语言:javascript
复制
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])

返回当前帧和引发当前正在处理的异常的帧之间堆栈的帧记录列表。列表中的第一个条目表示调用者; 最后一个条目表示引发异常的位置。

扫码关注腾讯云开发者

领取腾讯云代金券