inspect模块
inspect模块提供了几个有用的函数来帮助获取关于活动对象的信息,比如模块、类、方法、函数、回溯、框架对象和代码对象。例如,它可以帮助您检查类的内容、检索方法的源代码、提取和格式化函数的参数列表,或者获得显示详细回溯所需的所有信息。
官网:https://docs.python.org/3/library/inspect.html
类型和成员
该getmembers()函数检索对象(例如类或模块)的成员。名称以“是”开头的函数主要作为第二个参数的方便选择getmembers()。它们还可以帮助您确定何时可以找到以下特殊属性:
|
类型 |
属性 |
描述 |
|---|---|---|
|
模 |
__doc__ |
文档字符串 |
|
__file__ |
文件名(内置模块缺少) |
|
|
类 |
__doc__ |
文档字符串 |
|
__name__ |
用于定义此类的名称 |
|
|
__qualname__ |
合格的名字 |
|
|
__module__ |
定义此类的模块的名称 |
|
|
方法 |
__doc__ |
文档字符串 |
|
__name__ |
用于定义此方法的名称 |
|
|
__qualname__ |
合格的名字 |
|
|
__func__ |
包含方法实现的函数对象 |
|
|
__自__ |
此方法绑定的实例,或 |
|
|
function |
__doc__ |
文档字符串 |
|
__name__ |
用于定义此函数的名称 |
|
|
__qualname__ |
合格的名字 |
|
|
__code__ |
包含已编译函数字节码的代码对象 |
|
|
__defaults__ |
位置或关键字参数的任何默认值的元组 |
|
|
__kwdefaults__ |
仅限关键字参数的任何默认值的映射 |
|
|
__globals__ |
定义此函数的全局命名空间 |
|
|
__annotations__ |
参数名称到注释的映射; |
|
|
Traceback |
tb_frame |
此级别的框架对象 |
|
tb_lasti |
字节码中最后一次尝试指令的索引 |
|
|
tb_lineno |
Python源代码中的当前行号 |
|
|
tb_next |
下一个内部追溯对象(由此级别调用) |
|
|
frame |
f_back |
下一个外框对象(此框架的调用者) |
|
f_builtins |
此框架看到的builtins命名空间 |
|
|
f码 |
在此框架中执行的代码对象 |
|
|
f_globals |
此框架看到的全局命名空间 |
|
|
f_lasti |
字节码中最后一次尝试指令的索引 |
|
|
f_lineno |
Python源代码中的当前行号 |
|
|
f_locals |
此框架看到的本地命名空间 |
|
|
f_trace |
跟踪此框架的功能,或 |
|
|
code |
co_argcount |
参数个数(不包括仅关键字参数,*或**参数) |
|
co_code |
原始编译字节码的字符串 |
|
|
co_cellvars |
单元格变量名称的元组(由包含范围引用) |
|
|
co_consts |
字节码中使用的常量元组 |
|
|
co_filename |
创建此代码对象的文件的名称 |
|
|
co_firstlineno |
Python源代码中的第一行数 |
|
|
co_flags |
|
|
|
co_lnotab |
编码的行号到字节码索引的映射 |
|
|
co_freevars |
自由变量名称的元组(通过函数的闭包引用) |
|
|
co_kwonlyargcount |
仅关键字参数的数量(不包括** arg) |
|
|
co_name |
用于定义此代码对象的名称 |
|
|
co_names |
局部变量名称的元组 |
|
|
co_nlocals |
局部变量的数量 |
|
|
co_stacksize |
需要虚拟机堆栈空间 |
|
|
co_varnames |
参数名称和局部变量的元组 |
|
|
generator |
__name__ |
名称 |
|
__qualname__ |
合格的名字 |
|
|
gi_frame |
帧 |
|
|
gi_running |
发电机在运转吗? |
|
|
gi_code |
码 |
|
|
gi_yieldfrom |
对象被迭代 ,或 |
|
|
coroutine |
__name__ |
名称 |
|
__qualname__ |
合格的名字 |
|
|
cr_await |
正在等待的对象,或 |
|
|
cr_frame |
帧 |
|
|
cr_running |
是的协程运行? |
|
|
cr_code |
码 |
|
|
cr_origin |
coroutine创建的地方,或者 |
|
|
内置 |
__doc__ |
文档字符串 |
|
__name__ |
此函数或方法的原始名称 |
|
|
__qualname__ |
合格的名字 |
|
|
__self__ |
绑定方法的实例,或 |
在版本3.5中更改:向生成器添加__qualname__和gi_yieldfrom属性。
__name__现在,从函数名称而不是代码名称设置生成器的属性,现在可以对其进行修改。
在版本3.7中更改:cr_origin向协同程序添加属性。
inspect.getmembers(对象[,谓词] )
-
返回按名称排序的(名称,值)对列表中对象的所有成员。如果提供了可选的谓词参数,则仅包含谓词返回true值的成员。
注意
getmembers()当参数是一个类时,它将只返回元类中定义的类属性,并且这些属性已在元类的自定义中列出__dir__()。
inspect.getmodulename(路径)
-
返回由文件路径命名的模块的名称,不包括封装包的名称。将针对中的所有条目检查文件扩展名
importlib.machinery.all_suffixes()。如果匹配,则返回最终路径组件,并删除扩展名。否则,None返回。请注意,此函数仅为实际Python模块返回有意义的名称 - 可能仍将返回可能引用Python包的路径
None。在版本3.3中更改:该功能直接基于
importlib。
inspect.ismodule(对象)
-
如果对象是模块,则返回true。
inspect.isclass(对象)
-
如果对象是类,无论是内置的还是在Python代码中创建的,则返回true。
inspect.ismethod(对象)
-
如果对象是用Python编写的绑定方法,则返回true。
inspect.isfunction(对象)
-
如果对象是Python函数,则返回true,其中包括由lambda表达式创建的函数。
inspect.isgeneratorfunction(对象)
-
如果对象是Python生成器函数,则返回true。
inspect.isgenerator(对象)
-
如果对象是生成器,则返回true。
inspect.iscoroutinefunction(对象)
inspect.iscoroutine(对象)
inspect.isawaitable(对象)
-
如果可以在
await表达式中使用该对象,则返回true 。也可用于区分基于生成器的协同程序与常规生成器:
def gen(): yield @types.coroutine def gen_coro(): yield assert not isawaitable(gen()) assert isawaitable(gen_coro())版本3.5中的新功能。
inspect.isasyncgenfunction(对象)
-
如果对象是异步生成器函数,则返回true ,例如:
import inspect async def agen(): yield 1 print(inspect.isasyncgenfunction(agen))
版本3.6中的新功能。
inspect.isasyncgen(对象)
inspect.istraceback(对象)
-
如果对象是回溯,则返回true。
inspect.isframe(对象)
-
如果对象是框架,则返回true。
inspect.iscode(对象)
-
如果对象是代码,则返回true。
inspect.isbuiltin(对象)
-
如果对象是内置函数或绑定的内置方法,则返回true。
inspect.isroutine(对象)
-
如果对象是用户定义的函数或内置函数或方法,则返回true。
inspect.isabstract(对象)
-
如果对象是抽象基类,则返回true。
inspect.ismethoddescriptor(对象)
-
如果对象是一个方法描述符返回true,但如果
ismethod(),isclass(),isfunction()或者isbuiltin()是真实的。例如,这是正确的
int.__add__。传递此测试的对象有一个__get__()方法但不是__set__()方法,但除此之外,属性集也会有所不同。一个__name__属性通常是明智的,而且__doc__往往是。通过也传递其他测试之一的描述符实现的方法在测试中返回false
ismethoddescriptor(),仅仅因为其他测试承诺更多 - 例如,__func__当对象通过时,您可以依靠具有 属性(etc)ismethod()。
inspect.isdatadescriptor(对象)
-
如果对象是数据描述符,则返回true。
数据描述符既有a
__get__又有__set__方法。示例是属性(在Python中定义),getsets和成员。后两者在C中定义,并且有更多特定的测试可用于这些类型,这在Python实现中是健壮的。典型地,数据描述符也将具有__name__与__doc__属性(属性,getsets,和成员同时具有这些属性的),但是这不被保证。
inspect.isgetsetdescriptor(对象)
-
如果对象是getset描述符,则返回true。
CPython实现细节: getsets是通过
PyGetSetDef结构在扩展模块中定义的属性 。对于没有这种类型的Python实现,此方法将始终返回False。
inspect.ismemberdescriptor(对象)
-
如果对象是成员描述符,则返回true。
CPython实现细节:成员描述符是扩展模块中通过
PyMemberDef结构定义的属性 。对于没有这种类型的Python实现,此方法将始终返回False。
检索源代码
inspect.getdoc(对象)
-
获取对象的文档字符串,并使用
cleandoc()。如果未提供对象的文档字符串,并且对象是类,方法,属性或描述符,则从继承层次结构中检索文档字符串。版本3.5中已更改:如果未覆盖,则现在继承文档字符串。
inspect.getcomments(对象)
-
在单个字符串中返回对象源代码之前的任何注释行(对于类,函数或方法),或者在Python源文件的顶部(如果对象是模块)。如果对象的源代码不可用,请返回
None。如果在C或交互式shell中定义了对象,则可能会发生这种情况。
inspect.getfile(对象)
-
返回定义了对象的(文本或二进制)文件的名称。
TypeError如果对象是内置模块,类或函数,则会失败。
inspect.getmodule(对象)
-
尝试猜测定义了一个对象的模块。
inspect.getsourcefile(对象)
-
返回定义了对象的Python源文件的名称。
TypeError如果对象是内置模块,类或函数,则会失败。
inspect.getsourcelines(对象)
-
返回对象的源行和起始行号列表。参数可以是模块,类,方法,函数,回溯,框架或代码对象。源代码作为对应于该对象的行的列表返回,并且行号指示原始源文件中找到第一行代码的位置。
OSError如果无法检索源代码,则引发An 。
inspect.getsource(对象)
-
返回对象的源代码文本。参数可以是模块,类,方法,函数,回溯,框架或代码对象。源代码作为单个字符串返回。
OSError如果无法检索源代码,则引发An 。
inspect.cleandoc(doc )
-
清除文档字符串中的缩进,缩进以与代码块对齐。
从第一行删除所有前导空格。可以从第二行开始均匀移除的任何前导空格都将被删除。随后删除开头和结尾处的空行。此外,所有选项卡都扩展为空格。
可调用的反思与Signature对象
版本3.3中的新功能。
Signature对象表示可调用对象的调用签名及其返回注释。要检索Signature对象,请使用该signature() 功能。
inspect.signature(callable,*,follow_wrapped = True )
-
返回
Signature给定的对象callable:from inspect import signature def foo(a, *, b:int, **kwargs): pass sig = signature(foo) print(str(sig)) print(str(sig.parameters['b'])) print(sig.parameters['b'].annotation)
接受各种Python callables,从普通函数和类到
functools.partial()对象。ValueError如果不能提供签名,并且TypeError不支持该类型的对象,则引发。函数签名中的斜杠(/)表示其前面的参数仅为位置参数。有关详细信息,请参阅 有关仅位置参数的FAQ条目。
版本3.5中的新功能:
follow_wrapped参数。通过专门False签名callable(callable.__wrapped__不会用于打开装饰的callables。)注意
在某些Python实现中,某些可调用内容可能无法内省。例如,在CPython中,C中定义的一些内置函数不提供有关其参数的元数据。
class inspect.Signature(parameters = None,*,return_annotation = Signature.empty )
-
Signature对象表示函数的调用签名及其返回注释。对于函数接受的每个参数,它将
Parameter对象存储 在其parameters集合中。可选参数参数是一系列
Parameter对象,经过验证可以检查没有具有重复名称的参数,并且参数的顺序是正确的,即仅位置优先,然后是位置或关键字,以及参数默认情况下,参数不带默认值。可选的return_annotation参数,可以是任意Python对象,是可调用的“返回”注释。
签名对象是不可变的。使用
Signature.replace()作出修改后的副本。在版本3.5中更改:签名对象是可选择和可清除的。
empty-
一个特殊的类级标记,用于指定缺少返回注释。
parameters-
参数名称到相应
Parameter对象的有序映射 。参数以严格的定义顺序出现,包括仅关键字参数。在版本3.7中更改: Python仅明确保证它保留了版本3.7中仅关键字参数的声明顺序,尽管实际上此顺序始终保留在Python 3中。
return_annotation-
可调用的“返回”注释。如果callable没有“return”注释,则此属性设置为
Signature.empty。
bind(* args,** kwargs )-
创建从位置和关键字参数到参数的映射。返回
BoundArgumentsif*args和**kwargsmatch签名,或者引发aTypeError。
bind_partial(* args,** kwargs )-
以相同的方式工作
Signature.bind(),但允许省略一些必需的参数(模仿functools.partial()行为。)如果传递的参数与签名不匹配,则返回BoundArguments或引发aTypeError。
replace(* [,参数] [,return_annotation] )-
根据调用的实例替换创建新的Signature实例。可以传递不同的
parameters和/或return_annotation覆盖基本签名的相应属性。要从复制的签名中删除return_annotation,请传入Signature.empty。from inspect import signature def test(a, b): pass sig = signature(test) new_sig = sig.replace(return_annotation="new return anno") print(str(new_sig))
class inspect.Parameter(name,kind,*,default = Parameter.empty,annotation = Parameter.empty )
-
参数对象是不可变的。您可以使用
Parameter.replace()创建修改后的副本,而不是修改Parameter对象。在版本3.5中更改:参数对象是可选择的和可清除的。
empty-
一个特殊的类级别标记,用于指定缺少默认值和注释。
name-
作为字符串的参数名称。该名称必须是有效的Python标识符。
CPython实现细节: CPython
.0在用于实现理解和生成器表达式的代码对象上生成表单的隐式参数名称。在版本3.6中更改:这些参数名称由此模块公开为名称
implicit0。
default-
参数的默认值。如果参数没有默认值,则将此属性设置为
Parameter.empty。
annotation-
参数的注释。如果参数没有注释,则将此属性设置为
Parameter.empty。
kind-
描述参数值如何绑定到参数。可能的值(可通过
Parameter像Parameter.KEYWORD_ONLY):名称
含义
POSITIONAL_ONLY
值必须作为位置参数提供。
Python没有用于定义仅位置参数的明确语法,但许多内置和扩展模块函数(特别是那些只接受一个或两个参数的函数)接受它们。
POSITIONAL_OR_KEYWORD
值可以作为关键字或位置参数提供(这是Python中实现的函数的标准绑定行为。)
VAR_POSITIONAL
一个未绑定到任何其他参数的位置参数元组。这对应
*args于Python函数定义中的参数。KEYWORD_ONLY
值必须作为关键字参数提供。仅关键字参数是出现在Python函数定义中的条目
*或*args条目之后的参数。VAR_KEYWORD
关键字参数的字典,未绑定到任何其他参数。这对应
**kwargs于Python函数定义中的 参数。
-
-
示例:打印所有不带默认值的关键字参数:
from inspect import signature def foo(a, b, *, c, d=10): pass sig = signature(foo) for param in sig.parameters.values(): if (param.kind == param.KEYWORD_ONLY and param.default is param.empty): print('Parameter:', param)
根据调用的实例替换创建新的Parameter实例。要覆盖Parameter属性,请传递相应的参数。要从参数中删除默认值或/和注释,请传递Parameter.empty。
from inspect import Parameter param = Parameter('foo', Parameter.KEYWORD_ONLY, default=42) print(str(param)) print(str(param.replace())) # Will create a shallow copy of 'param') print(str(param.replace(default=Parameter.empty, annotation='spam')))
replace(* [,名称] [,种类] [,默认] [,注释] )
在3.4版中更改:在Python 3.3中
name,None如果将参数对象设置为,则允许参数对象kind设置为POSITIONAL_ONLY。这已不再允许。 -
类inspect.BoundArguments
-
一个
Signature.bind()或一个Signature.bind_partial()电话的结果。保存参数到函数参数的映射。arguments-
collections.OrderedDict参数'名称到参数'值的有序,可变映射()。仅包含显式绑定的参数。变化arguments将反映在args和kwargs。应与
Signature.parameters任何参数处理目的一起使用。注意
对于哪些参数
Signature.bind()或Signature.bind_partial()依赖于缺省值被跳过。但是,如果需要,请使用BoundArguments.apply_defaults()添加它们。
args-
位置参数值的元组。从
arguments属性动态计算 。
kwargs-
关键字参数值的字典。从
arguments属性动态计算 。
signature-
对父
Signature对象的引用。
apply_defaults()-
设置缺少参数的默认值。
对于变量位置参数(
*args),默认值为空元组。对于变量关键字参数(
**kwargs),默认值为空dict。from inspect import OrderedDict,signature def foo(a, b='ham', *args): pass ba = signature(foo).bind('spam') ba.apply_defaults() print(ba.arguments) OrderedDict([('a', 'spam'), ('b', 'ham'), ('args', ())])
版本3.5中的新功能。
from inspect import signature def test(a, *, b): ... sig = signature(test) ba = sig.bind(10, b=20) print(test(*ba.args, **ba.kwargs))
也可以看看
- PEP 362 - 功能签名对象。
-
详细规范,实现细节和示例。
类和函数
inspect.getclasstree(classes,unique = False )
-
将给定的类列表排列为嵌套列表的层次结构。在出现嵌套列表的地方,它包含从类中派生的类,该类的条目紧接在列表之前。每个条目都是一个2元组,包含一个类和一个基类的元组。如果唯一参数为true,则给定列表中每个类的返回结构中只显示一个条目。否则,使用多重继承的类及其后代将多次出现。
inspect.getargspec(func )
-
获取Python函数参数的名称和默认值。返回一个 命名元组 。args是参数名称的列表。varargs和keywords 是和参数或的名称。defaults是默认参数值的元组,或者如果没有默认参数; 如果这个元组有n个元素,它们对应于args中列出的最后 n个元素。
ArgSpec(args, varargs, keywords, defaults)***NoneNone自从3.0版本不推荐使用:使用
getfullargspec()一个更新的API,它通常是一个简易替换,而且正确处理功能注释,只有关键字参数。或者,使用
signature()和 签名对象,它为可调用对象提供更结构化的内省API。
inspect.getfullargspec(func )
-
获取Python函数参数的名称和默认值。返回一个 命名元组:
FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations)args是位置参数名称的列表。 varargs是参数的名称,
*或者None如果不接受任意位置参数。 varkw是**参数的名称,或者None如果不接受任意关键字参数。 defaults是与最后n个位置参数对应的默认参数值的n元组,或者如果没有定义这样的默认值。 kwonlyargs是声明顺序中仅关键字参数名称的列表。 kwonlydefaults是一个字典映射来自kwonlyargs的参数名称None如果没有提供参数,则使用默认值。 annotations是将参数名称映射到注释的字典。特殊键"return"用于报告函数返回值注释(如果有)。请注意,
signature()并 签名对象提供可调用的自省推荐的API,并支持其他行为(如位置-only参数),其在扩展模块的API有时会遇到。保留此函数主要用于需要保持与Python 2inspect模块API 兼容的代码。版本3.4中已更改:此函数现在基于
signature()但仍忽略__wrapped__属性,并在绑定方法的签名输出中包含已绑定的第一个参数。版本3.6中已更改:此方法之前已在
signature()Python 3.5中被弃用 ,但该决定已被颠倒,以便为从源getargspec()API 迁移的单源Python 2/3代码恢复明确支持的标准接口 。在版本3.7中更改: Python仅明确保证它保留了版本3.7中仅关键字参数的声明顺序,尽管实际上此顺序始终保留在Python 3中。
inspect.getargvalues(框架)
-
获取有关传递到特定框架的参数的信息。返回一个 命名元组 。args是参数名称的列表。 varargs和keywords是和参数或的名称。 locals是给定框架的locals字典。
ArgInfo(args, varargs, keywords, locals)***None注意
在Python 3.5中,此函数无意中被标记为已弃用。
inspect.formatargspec(ARGS [,可变参数,varkw,默认值,kwonlyargs,kwonlydefaults,注释[,formatarg,formatvarargs,formatvarkw,formatvalue,formatreturns,formatannotations ] ] )
-
从返回的值格式化漂亮的参数规范
getfullargspec()。前七个参数是(
args,varargs,varkw,defaults,kwonlyargs,kwonlydefaults,annotations)。其他六个参数是被调用的函数,分别用于将参数名称,
*参数名称,**参数名称,默认值,返回注释和单个注释转换为字符串。例如:
from inspect import formatargspec, getfullargspec def f(a: int, b: float): pass print(formatargspec(*getfullargspec(f)))
从版本3.5开始不推荐使用:使用
signature()和 签名对象,它为callables提供了更好的内省API。
inspect.formatargvalues(args [,varargs,varkw,locals,formatarg,formatvarargs,formatvarkw,formatvalue ] )
-
从返回的四个值格式化漂亮的参数规范
getargvalues()。格式*参数是相应的可选格式化函数,用于将名称和值转换为字符串。注意
在Python 3.5中,此函数无意中被标记为已弃用。
inspect.getmro(cls )
-
以方法解析顺序返回类cls基类的元组,包括cls。在这个元组中没有类出现过多次。请注意,方法解析顺序取决于cls的类型。除非使用非常特殊的用户定义的元类型,否则cls将是元组的第一个元素。
inspect.getcallargs(func,* args,** kwds )
-
将args和kwds绑定到Python函数或方法func的参数名称,就像使用它们调用它一样。对于绑定方法,还将第一个参数(通常是命名
self)绑定到关联实例。返回一个dict,将参数名称(包括*和**参数的名称,如果有的话)映射到args和kwds的值。如果错误地调用func,即由于签名不兼容而无论何时引发异常,都会引发相同类型和相同或类似消息的异常。例如:func(*args, **kwds)from inspect import getcallargs def f(a, b=1, *pos, **named): pass print(getcallargs(f, 1, 2, 3) == {'a': 1, 'named': {}, 'b': 2, 'pos': (3,)}) print(getcallargs(f, a=2, x=4) == {'a': 2, 'named': {'x': 4}, 'b': 1, 'pos': ()}) # getcallargs(f)
版本3.2中的新功能。
从版本3.5开始不推荐使用:使用
Signature.bind()而Signature.bind_partial()不是。
inspect.getclosurevars(func )
-
获取Python函数或方法函数中的外部名称引用到其当前值的映射。 返回一个 命名元组 。nonlocals将引用的名称映射到词法闭包变量,将globals引用到函数的模块全局变量,并将内置函数映射到函数体可见的内置函数。unbound是函数中引用的名称集,在给定当前模块globals和builtins的情况下根本无法解析。
ClosureVars(nonlocals, globals, builtins, unbound)TypeError如果func不是Python函数或方法,则引发此异常。版本3.3中的新功能。
inspect.unwrap(func,*,stop = None )
-
获取func包装的对象。它遵循
__wrapped__返回链中最后一个对象的属性链。stop是一个可选的回调函数,接受包装器链中的一个对象作为其唯一参数,如果回调返回true值,则允许提前终止解包。如果回调永远不会返回true值,则会像往常一样返回链中的最后一个对象。例如,
signature()如果链中的任何对象__signature__定义了属性,则 使用此方法停止展开。ValueError如果遇到一个循环,则会引发。版本3.4中的新功能。
解释器堆栈
当以下函数返回“帧记录”时,每个记录都是一个 命名元组 。元组包含框架对象,文件名,当前行的行号,函数名称,源代码中的上下文行列表以及该列表中当前行的索引。FrameInfo(frame, filename, lineno, function,code_context, index)
在版本3.5中更改:返回命名元组而不是元组。
注意
保持对框架对象的引用,如在框架的第一个元素中记录这些函数返回,可以使程序创建引用循环。一旦创建了引用循环,即使启用了Python的可选循环检测器,从形成循环的对象可以访问的所有对象的生命周期也会变得更长。如果必须创建这样的循环,则必须确保它们被明确地破坏以避免对象的延迟破坏和增加的内存消耗。
虽然循环检测器将捕获这些,但是通过删除finally子句中的循环可以使帧(和局部变量)的破坏成为确定性的。如果在编译或使用Python时禁用循环检测器,这也很重要gc.disable()。例如:
def handle_stackframe_without_leak(): frame = inspect.currentframe() try: # do something with the frame finally: del frame
如果要保留框架(例如稍后打印回溯),则还可以使用该frame.clear()方法中断参考循环 。
大多数这些函数支持的可选上下文参数指定要返回的上下文行数,这些行以当前行为中心。
inspect.getframeinfo(frame,context = 1 )
-
获取有关帧或回溯对象的信息。返回一个命名元组 。
Traceback(filename, lineno, function, code_context,index)
inspect.getouterframes(frame,context = 1 )
-
获取帧和所有外部帧的帧记录列表。这些帧表示导致产生的呼叫帧。返回列表中的第一个条目表示框架 ; 最后一个条目表示帧堆栈的最外层调用。
在版本3.5中更改: 返回命名元组 的列表。
FrameInfo(frame, filename, lineno, function, code_context,index)
inspect.getinnerframes(traceback,context = 1 )
-
获取回溯帧和所有内部帧的帧记录列表。这些帧表示作为帧结果的调用。列表中的第一个条目代表追溯 ; 最后一个条目表示引发异常的位置。
在版本3.5中更改: 返回命名元组 的列表。
FrameInfo(frame, filename, lineno, function, code_context,index)
inspect.currentframe()
-
返回调用者堆栈帧的帧对象。
CPython实现细节:此函数依赖于解释器中的Python堆栈框架支持,但不保证在Python的所有实现中都存在这种支持。如果在没有Python堆栈框支持的实现中运行,则此函数返回
None。
inspect.stack(context = 1 )
-
返回调用者堆栈的帧记录列表。返回列表中的第一个条目代表调用者; 最后一个条目表示堆栈上最外层的调用。
在版本3.5中更改: 返回命名元组 的列表。
FrameInfo(frame, filename, lineno, function, code_context,index)
inspect.trace(context = 1 )
-
返回当前帧与当前正在处理异常的帧之间的堆栈帧记录列表。列表中的第一个条目表示调用者; 最后一个条目表示引发异常的位置。
在版本3.5中更改: 返回命名元组 的列表。
FrameInfo(frame, filename, lineno, function, code_context,index)
静态获取属性
既getattr()和hasattr()提取或检查属性的存在时可以触发代码的执行。描述符和属性一样,将被调用,__getattr__()并且__getattribute__() 可以被调用。
对于需要被动内省的情况,例如文档工具,这可能很不方便。getattr_static()具有相同的签名,getattr() 但避免在获取属性时执行代码。
inspect.getattr_static(obj,attr,默认=无)-
检索属性而不通过描述符协议触发动态查找,
__getattr__()或__getattribute__()。注意:此函数可能无法检索getattr可以获取的所有属性(如动态创建的属性),并且可能找到getattr无法获取的属性(如引发AttributeError的描述符)。它还可以返回描述符对象而不是实例成员。
如果实例
__dict__被另一个成员(例如属性)遮蔽,则此函数将无法找到实例成员。版本3.2中的新功能。
getattr_static() 不解析描述符,例如在C中实现的对象上的槽描述符或getset描述符。返回描述符对象而不是底层属性。
您可以使用以下代码处理这些问题。请注意,对于任意getset描述符,调用它们可能会触发代码执行:
# example code for resolving the builtin descriptor types class _foo: __slots__ = ['foo'] slot_descriptor = type(_foo.foo) getset_descriptor = type(type(open(__file__)).name) wrapper_descriptor = type(str.__dict__['__add__']) descriptor_types = (slot_descriptor, getset_descriptor, wrapper_descriptor) result = getattr_static(some_object, 'foo') if type(result) in descriptor_types: try: result = result.__get__() except AttributeError: # descriptors can raise AttributeError to # indicate there is no underlying value # in which case the descriptor itself will # have to do pass
发电机和协程的当前状态
在实现协同调度程序和生成器的其他高级用法时,确定生成器当前是在执行,是等待启动还是恢复或执行,还是已经终止是很有用的。getgeneratorstate()允许容易地确定发电机的当前状态。
inspect.getgeneratorstate(发电机)
-
获取生成器迭代器的当前状态。
- 可能的状态是:
-
-
GEN_CREATED:等待开始执行。
-
GEN_RUNNING:当前正由翻译执行。
-
GEN_SUSPENDED:目前在yield表达式中暂停。
-
GEN_CLOSED:执行已完成。
-
版本3.2中的新功能。
inspect.getcoroutinestate(协程)
-
获取协程对象的当前状态。该函数旨在与函数创建的协程对象一起使用,但是将接受具有和 属性的任何类似协程的对象。
async defcr_runningcr_frame- 可能的状态是:
-
-
CORO_CREATED:等待开始执行。
-
CORO_RUNNING:当前正由翻译执行。
-
CORO_SUSPENDED:当前在await表达式中暂停。
-
CORO_CLOSED:执行已完成。
-
版本3.5中的新功能。
还可以查询发电机的当前内部状态。这主要用于测试目的,以确保内部状态按预期更新:
inspect.getgeneratorlocals(发电机)
-
获取生成器中的实时局部变量到其当前值的映射。返回从变量名称映射到值的字典。这相当于调用
locals()生成器的主体,并且所有相同的警告都适用。如果generator是没有当前关联帧的生成器,则返回空字典。
TypeError如果generator不是Python生成器对象,则引发 此异常。CPython实现细节:这个函数依赖于生成器暴露Python堆栈框架以进行内省,但在所有Python实现中都不能保证这种情况。在这种情况下,此函数将始终返回空字典。
版本3.3中的新功能。
inspect.getcoroutinelocals(协程)
-
此函数类似于
getgeneratorlocals(),但适用于由函数创建的协程对象。async def版本3.5中的新功能。
代码对象位标志
Python代码对象有一个co_flags属性,它是以下标志的位图:
inspect.CO_OPTIMIZED
-
使用快速本地优化代码对象。
inspect.CO_NEWLOCALS
-
如果设置,
f_locals则在执行代码对象时将为帧创建新的dict 。
inspect.CO_VARARGS
-
代码对象具有可变位置参数(类似
*args)。
inspect.CO_VARKEYWORDS
-
代码对象具有可变关键字参数(类似
**kwargs)。
inspect.CO_NESTED
-
当代码对象是嵌套函数时,将设置该标志。
inspect.CO_GENERATOR
-
当代码对象是生成器函数时设置标志,即在执行代码对象时返回生成器对象。
inspect.CO_NOFREE
-
如果没有空闲或单元格变量,则设置该标志。
inspect.CO_COROUTINE
-
当代码对象是协程函数时,设置该标志。执行代码对象时,它返回一个协程对象。看到PEP 492了解更多详情。
版本3.5中的新功能。
inspect.CO_ITERABLE_COROUTINE
-
该标志用于将生成器转换为基于生成器的协同程序。具有此标志的生成器对象可以在
await表达式中使用,并且可以协同对象。看到yield fromPEP 492了解更多详情。版本3.5中的新功能。
inspect.CO_ASYNC_GENERATOR
-
当代码对象是异步生成器函数时,将设置该标志。执行代码对象时,它返回一个异步生成器对象。看到PEP 525了解更多详情。
版本3.6中的新功能。
注意
这些标志特定于CPython,可能不会在其他Python实现中定义。此外,标志是一个实现细节,可以在将来的Python版本中删除或弃用。建议使用inspect模块中的公共API来满足任何内省需求。
命令行界面
该inspect模块还从命令行提供基本的内省功能。
默认情况下,接受模块的名称并打印该模块的源。可以通过附加冒号和目标对象的限定名称来打印模块中的类或函数。
--details-
打印有关指定对象而不是源代码的信息

浙公网安备 33010602011771号