– 检查实时对象 – Python运行时服务(Python教程)(参考资料)
inspect
– 检查实时对象
inspect
模块提供了几个有用的函数来帮助获取有关活动对象的信息,例如模块,类,方法,函数,回溯,框架对象和代码对象。例如,它可以帮助您检查类的内容,检索方法的源代码,提取和格式化函数的参数列表,或获取显示详细的traceback所需的所有信息.
有这个模块提供的四种主要服务:类型检查,获取源代码,检查类和函数,以及检查解释器堆栈.
类型和成员
getmembers()
功能检索对象(如aclass或模块)的成员。名称以“是”开头的函数主要是为getmembers()
的第二个参数提供方便的选择。它们还可以帮助您确定何时可以找到以下specialattributes:
类型 | 属性 | 说明 |
---|---|---|
模块 | __ doc __ | 文档字符串 |
__ file __ | 文件名(缺少内置模块) | |
class | __ doc __ | 文档字符串 |
__ name __ | 用于定义此类的名称 | |
__ qualname __ | 限定名称 | |
__ module __ | 定义了这个类的模块的名称 | |
方法 | __ doc __ | 文档字符串 |
__ name__ | 用于定义此方法的名称 | |
__ qualname __ | 限定名称 | |
__ func __ | 功能对象包含方法的实现 | |
__self __ | 这个方法绑定的实例,或None |
|
功能 | __ doc __ | 文档字符串 |
__ name __ | 用于定义此函数的名称 | |
__ qualname __ | 限定名称 | |
__ code __ | 包含编译函数的代码对象字节码 | |
__ defaults __ | 位置或关键字参数的任何默认值的元组 | |
__ kwdefaults __ | 仅限关键字参数的任何默认值的映射 | |
__globals __ | 定义了这个函数的全局命名空间 | |
__ annotations __ | 将参数名称映射到注释; "return" key保留为returnannotations. |
|
traceback | tb_frame | 此对象的框架对象 |
tb_lasti | 字节码中最后一次尝试构造的索引 | |
tb_lineno | 当前行号inPython源代码 | |
tb_next | next inner tracebackobject(由thislevel调用) | |
frame | f_back | next outer frame对象(这个框架的调用者) |
f_builtins | 这个框架看到的内置命名空间 | |
f_code | 代码对象在这个框架中被执行 | |
f_globals | 这个框架看到的全局命名空间 | |
f_lasti | 字节码中最后一次尝试构造的索引 | |
f_lineno | 当前行号inPython源代码 | |
f_locals | 这个框架看到的本地命名空间 | |
f_trace | 这个框架的跟踪功能,或None |
|
代码 | co_argcount | 参数个数(不包括关键字onlyarguments,*或** args) |
co_code | raw rawbycode的字符串 | |
co_cellvars | 元组名称的元组((包含范围引用) | |
co_consts | 字节码中使用的常量元组 | |
co_filename | 创建此代码对象的文件名 | |
co_firstlineno | 第一行inPython源代码的数量 | |
co_flags | CO_* 的位图标志,阅读更多这里 |
|
co_lnotab | 编码的亚麻码映射到bytecodeindices | |
co_freevars | 自由变量名称的元组(通过函数的闭包引用) | |
co_kwonlyargcount | 关键字onlyarguments的数量(不包括** arg) | |
co_name | 用于定义此代码对象的名称 | |
co_names | tuple of names oflocalvariables | |
co_nlocals | 局部变量数 | |
co_stacksize | 需要虚拟机堆栈空间 | |
co_varnames | 元组参数和局部变量的名称 | |
发生器 | __ name __ | 名称 |
__ qualname __ | 限定名称 | |
gi_frame | 框架 | |
gi_running | 是运行的发生器? | |
gi_code | 代码 | |
gi_yieldfrom | 对象被yield from 迭代,或None |
|
coroutine | __ name __ | name |
__ qualname __ | 限定名称 | |
cr_await | 正在等待的对象,或None |
|
cr_frame | 框架 | |
cr_running | 正在运行的协程? | |
cr_code | code | |
cr_origin | 其中coroutine是创建的,还是None 。见sys.set_coroutine_origin_tracking_depth() |
|
builtin | __ doc __ | 文件字符串 |
__ name __ | 这个函数或方法的原始名称 | |
__ qualname __ | 限定名称 | |
__ self __ | 与amethod绑定的实例,或None |
在版本3.7中更改:将cr_origin
属性添加到coroutines.
inspect.
getmembers
(object [, predicate] )-
返回按名称排序的(名称,值)对列表中对象的所有成员。如果提供了可选的predicate参数,则只包含谓词返回true值的成员.
注意
getmembers()
只返回参数为时在类中定义的类属性一个类和那些属性已经列在元类’custom__dir__()
.
inspect.
getmodulename
(path)-
返回文件名path命名的模块的名称,没有包括封闭包的名称。根据
importlib.machinery.all_suffixes()
中的所有条目检查文件扩展名。如果匹配,则返回最终路径组件并删除扩展名。否则,None
返回.注意这个函数only为actualPython模块返回一个有意义的名称 -可能引用Python包的路径将返回
None
.在版本3.3中更改:该函数直接基于
importlib
.
inspect.
ismodule
(object)-
如果对象是模块,则返回true.
inspect.
isclass
(object)-
如果对象是一个类,无论是内置的还是在Pythoncode中创建的,都返回true。
inspect.
ismethod
/object/-
如果对象是用Python编写的绑定方法,则返回true.
inspect.
isfunction
(object)-
如果对象是Python函数,则返回true,其中包含由 lambda 表达式创建的函数.
inspect.
isgeneratorfunction
(object)-
如果对象是Python生成器函数,则返回true .
inspect.
isgenerator
(object)-
如果对象是生成器,则返回true.
inspect.
iscoroutinefunction
(object)-
如果对象是协程函数,则返回true (用
async def
语法定义的函数).版本3.5中的新内容.
inspect.
iscoroutine
(object)-
返回true如果对象是协程由
async def
函数创建新版本3.5.
inspect.
isawaitable
(object)-
如果对象可以在
await
表达式中使用,则返回true还可用于区分基于生成器的协同程序与常规生成器:
def gen(): [email protected] gen_coro(): yieldassert not isawaitable(gen())assert isawaitable(gen_coro())
版本3.5中新增.
inspect.
isasyncgenfunction
(object)-
如果对象是异步发生器,则返回true 功能,例如:
>>> async def agen():... yield 1...>>> inspect.isasyncgenfunction(agen)True
版本3.6中的新功能.
inspect.
iscode
(object)-
如果对象是代码,则返回true.
inspect.
isbuiltin
(object)-
如果对象是内置函数或绑定内置方法,则返回true.
inspect.
isroutine
(object)-
如果object是用户定义的或内置的函数或方法.
inspect.
isabstract
(object )-
如果对象是抽象基类,则返回true .
inspect.
ismethoddescriptor
(object)-
如果对象是方法描述符,则返回true,但如果
ismethod()
,isclass()
,isfunction()
要么isbuiltin()
是真的例如,这对于
int.__add__
。通过此测试的对象有__get__()
方法但不是__set__()
方法,但除此之外,属性集也各不相同。一个__name__
属性通常是不可见的,而__doc__
经常是通过描述符实现的方法也通过其他测试中的一个从
ismethoddescriptor()
测试中返回false,仅仅是因为其他测试承诺更多 – 例如,你可以依靠具有__func__
属性(等)的时候一个对象传递ismethod()
.
inspect.
isdatadescriptor
(object)-
如果对象是数据描述符,则返回true。
数据描述符同时具有
__get__
和__set__
方法。示例是属性(在Python中定义),getsets和成员。Thelatter 2在C中定义,并且有更多特定的测试可用于类型,这在Python实现中是健壮的。通常,datadescriptors也会有__name__
和__doc__
属性(属性,getsets和成员都具有这两个属性),但这不保证.
inspect.
isgetsetdescriptor
(object)-
如果对象是getset描述符,则返回true。
CPython实现细节: getsets是扩展模块中通过
PyGetSetDef
结构定义的属性。对于没有这种类型的Python实现,此方法将始终返回False
.
inspect.
ismemberdescriptor
(object)-
如果对象是成员描述符,则返回true。
CPython实现细节:成员描述符是扩展模块中定义的属性
PyMemberDef
结构对于没有这种类型的Python实现,此方法将始终返回False
.
检索源代码
inspect.
getdoc
(object)-
获取对象的文档字符串,清理用
cleandoc()
。如果没有提供对象的文档字符串,并且对象是类,方法,属性或描述符,则从继承层次结构中检索documentationstring .更改版本3.5:文档字符串现在如果不被覆盖则继承.
inspect.
getcomments
(object)-
在单个字符串中返回对象源之前的任何注释行代码(用于类,函数或方法),或者在Python源文件的顶部(如果对象是模块)。如果对象的源代码不可用,则返回
None
。如果在C或交互式shell中定义了对象,则可能会发生这种情况.
inspect.
getfile
(object)-
返回定义了对象的(文本或二进制)文件的名称。这将失败并带有
TypeError
如果对象是内置模块,类或函数
inspect.
getmodule
(object)-
试着猜出一个物体定义在哪个模块中.
inspect.
getsourcefile
(object)-
返回定义了对象的Python源文件的名称。这将失败
TypeError
如果对象是内置模块,类或函数
inspect.
getsourcelines
(object)-
返回对象的源行和起始行号列表。该参数可以是模块,类,方法,函数,回溯,框架或代码对象。源代码作为对应于对象的行的列表返回,行号指示原始源文件中找到代码的第一行的位置。一个
OSError
如果无法检索源代码,则会引发.在版本3.3中更改:
OSError
而不是IOError
,现在是前者的别名
inspect.
getsource
//(object)-
返回对象的源代码文本。参数可以是模块,类,方法,函数,回溯,框架或代码对象。源代码作为单个字符串返回。一个
OSError
如果无法检索源代码,则会引发此问题.改版3.3:
OSError
被提出而不是IOError
,现在是theformer的形象.
inspect.
cleandoc
(doc)-
清除文档字符串中的缩进,缩进以与代码块对齐.
从第一行删除所有前导空格。可以从第二行开始均匀移除的任何前导空格被移除。随后删除开头和结尾的空行。此外,所有标签都扩展到空间.
用Signature对象反省callable
3.3版本中的新功能
Signature对象表示可调用对象的调用签名及其返回注释。要检索Signature对象,请使用signature()
function.
inspect.
signature
(callable, *, follow_wrapped=True)-
返回
Signature
给定的对象callable
:>>> from inspect import signature>>> def foo(a, *, b:int, **kwargs):... pass>>> sig = signature(foo)>>> str(sig)"(a, *, b:int, **kwargs)">>> str(sig.parameters["b"])"b:int">>> sig.parameters["b"].annotation<class "int">
接受各种Python的callables,从简单的函数和类到
functools.partial()
对象.Raises
ValueError
如果不能提供签名,TypeError
如果不支持那种类型的对象.注意
某些callables在某些Python实现中可能无法反省。例如,在CPython中,C中定义的一些内置函数不提供有关其参数的元数据.
- class
inspect.
Signature
(parameters=None, *, return_annotation=Signature.empty) -
Signature对象表示函数的调用签名及其返回注释。对于函数接受的每个参数,它在
Parameter
集合中存储一个parameters
对象.可选的parameters参数是
Parameter
对象,经过验证可以检查没有带有重复名称的参数,并且参数的顺序是正确的,即首先是仅位置,然后是位置或关键字,带有默认值的参数遵循参数而不是默认值.可选的return_annotation参数,可以是一个任意的Python对象,是callable的“return”注释.
签名对象是immutable。使用
Signature.replace()
制作经过修改的复印件.在版本3.5中更改:签名对象是可选择的和可哈希的
empty
-
一个特殊的类级别标记来指定缺少返回注释.
parameters
-
参数名称到对应的
Parameter
对象的有序映射。参数以严格的定义顺序出现,包括仅限关键字的参数.更改版本3.7:Python只明确保证它保留了版本3.7中仅关键字参数的声明顺序,尽管实际上这个顺序一直保留在Python 3中.
return_annotation
-
可调用的“返回”注释。如果callable没有“return”注释,则该属性设置为
Signature.empty
.
bind_partial
(*args, **kwargs)-
与
Signature.bind()
,但允许省略一些必要的参数(模仿functools.partial()
行为。)如果被传递的参数与签名不匹配,则返回BoundArguments
,或者引发TypeError
.
replace
(*[, parameters][, return_annotation])-
基于调用实例替换创建新的Signature实例。可以通过不同的
parameters
和/或return_annotation
覆盖baseignature的相应属性。要从复制的签名中删除return_annotation,请传入Signature.empty
.>>> def test(a, b):... pass>>> sig = signature(test)>>> new_sig = sig.replace(return_annotation="new return anno")>>> str(new_sig)"(a, b) -> "new return anno""
- class
inspect.
Parameter
(name, kind, *, default=Parameter.empty, annotation=Parameter.empty) -
参数对象是immutable。您可以使用
Parameter.replace()
创建修改后的副本.在版本3.5中更改:参数对象是可选择的和可散列的
empty
-
一个特殊的类级别标记来指定缺少默认值和注释.
name
-
作为字符串的参数名称。名称必须是validPython标识符.
default
-
参数的默认值。如果参数没有defaultvalue,则此属性设置为
Parameter.empty
.
annotation
-
参数的注释。如果参数没有注释,则此属性设置为
Parameter.empty
.
kind
-
描述参数值如何绑定到参数。可能的值(可通过
Parameter
,就像Parameter.KEYWORD_ONLY
):名称 含义 POSITIONAL_ONLY 价值必须作为一个位置报告提供.
Python没有用于定义仅限定位参数的明确语法,但是许多内置和扩展模块函数(尤其是只接受一个或两个参数的函数)接受它们.
POSITIONAL_OR_KEYWORD 值可以作为关键字或位置参数提供(这是在Python中实现的函数的标准绑定行为。) VAR_POSITIONAL 不与任何其他参数绑定的位置参数元组。这对应于aPython函数定义中的 *args
参数.KEYWORD_ONLY 值必须作为关键字参数提供。仅限参数是在aPython函数定义中的 *
或*args
条目之后的参数.VAR_KEYWORD 不绑定到任何其他参数的关键字参数的字典。这对应于Python functiondefinition中的 **kwargs
参数.示例:打印所有不带默认值的仅关键字参数:
>>> 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: c
replace
(*[, name][, kind][, default][, annotation])-
基于被替换的实例创建一个新的参数实例被调用。覆盖
Parameter
属性,传递相应的参数。要从aParameter中删除默认值或/和注释,请传递Parameter.empty
.>>> from inspect import Parameter>>> param = Parameter("foo", Parameter.KEYWORD_ONLY, default=42)>>> str(param)"foo=42">>> str(param.replace()) # Will create a shallow copy of "param""foo=42">>> str(param.replace(default=Parameter.empty, annotation="spam"))"foo:"spam""
在版本3.4中更改:在Python 3.3中允许参数对象有
name
调成None
如果他们的kind
设为POSITIONAL_ONLY
。这不再允许了.
- class
inspect.
BoundArguments
-
结果
Signature.bind()
要么Signature.bind_partial()
call.Holds参数的映射到函数的参数.arguments
-
有序的,可变的映射(
collections.OrderedDict
)参数的名称与参数的值。仅包含显式的boundarguments。arguments
的变化将反映在args
和kwargs
.应与
Signature.parameters
用于任何参数处理目的.注意
跳过依赖于默认值的
Signature.bind()
或Signature.bind_partial()
的参数。但是,如果需要,请使用BoundArguments.apply_defaults()
添加它们
kwargs
-
动态计算关键字参数值的字典。从
arguments
属性
apply_defaults
()-
设置缺失参数的默认值.
对于变量位置arguments(
*args
)默认是anmpty tuple。对于变量关键字参数(
**kwargs
),默认值为dunc。>>> def foo(a, b="ham", *args): pass>>> ba = inspect.signature(foo).bind("spam")>>> ba.apply_defaults()>>> ba.argumentsOrderedDict([("a", "spam"), ("b", "ham"), ("args", ())])
新版本3.5.
def test(a, *, b): ...sig = signature(test)ba = sig.bind(10, b=20)test(*ba.args, **ba.kwargs)
参见
- PEP 362 – 功能签名对象.
- 详细说明,实施细节和实例.
课程和功能
inspect.
getclasstree
(classes, unique=False)-
将给定的类列表排列为嵌套列表的层次结构。在出现anested列表的地方,它包含从类中派生的类,该类的条目立即在列表之前。每个条目都是一个2元组,包含一个类和基类的元组。如果unique如果参数为true,则给定列表中每个类的返回结构中只显示一个条目。否则,使用多重继承的类及其后代将出现多次.
inspect.
getargspec
(func)-
获取Python函数参数的名称和默认值。一个命名的元组
ArgSpec(args, varargs, keywords, defaults)
被遗弃了。args是参数名称列表。varargs和keywords是*
和**
参数或None
. defaults是默认参数值的元组或None
如果没有默认参数;如果这个元组有n元素,它们对应的是n中列出的元素args.
inspect.
getfullargspec
(func )-
获取Python函数参数的名称和默认值。命名元组返回:
FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults,annotations)
args是位置参数名称列表.varargs是
*
的名称参数或None
如果不接受任意位置参数.varkw是**
参数的名称或None
如果不接受任意关键字参数.defaults是n – 对应于thelast n位置参数的默认参数值的元组,或None
如果没有这样的defaultsdefined.kwonlyargs是声明顺序中仅关键字参数名称列表.kwonlydefaults是一个字典映射参数名称从kwonlyargs到默认值,如果没有提供参数,则使用annotations是一个字典映射参数名称到注释。特殊键"return"
用于报告函数返回值注释(如果有的话).注意
signature()
和签名对象为可调用内省提供推荐的API,并支持扩展模块API中有时遇到的其他行为(如仅限位置参数)。保留此函数主要用于需要与Python 2保持兼容的代码inspect
模块API.更改版本3.4:此函数现在基于
signature()
,但仍然忽略__wrapped__
属性并包括绑定方法的签名输出中已绑定的第一个参数.更改版本3.6:此方法以前被记录为已弃用,有利于
signature()
在Python 3.5中,但为了恢复一个明确支持的标准接口,以恢复一个明显支持的标准接口forsingle-source Python 2/3代码迁移远离遗产getargspec()
API.更改版本3.7:Python只明确保证它保留了版本3.7中仅关键字参数的声明顺序,尽管实际上这个顺序一直保存在Python 3中.
inspect.
getargvalues
(frame)-
获取有关传递到特定帧的参数的信息。一个命名的元组
ArgInfo(args, varargs, keywords, locals)
被遗弃了。args是参数名称的列表。varargs和keywords是*
和**
争论或None
. locals是给定框架的thelocals字典.注意
这个函数在Python 3.5中被无意中标记为已弃用.
inspect.
formatargspec
(args[, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations[, 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...>>> formatargspec(*getfullargspec(f))"(a: int, b: float)"
inspect.
formatargvalues
(args [, varargs, varkw, locals, formatarg, formatvarargs, formatvarkw, formatvalue])-
从
getargvalues()
。格式*参数是相应的可选格式化函数,用于将名称和值转换为字符串.注意
这个函数在Python 3.5中被无意中标记为已弃用.
inspect.
getmro
(cls)-
在方法解析顺序中返回类cls的基类元组,包括cls。在这个元组中没有类出现过多次。请注意,methodresolution顺序取决于cls的类型。除非使用非常特殊的用户定义的类型,否则cls将成为元组的第一个元素.
inspect.
getcallargs
(func, *args, **kwds)-
将args和kwds绑定到Python函数ormethod func的参数名称,好像它被调用一样跟他们。对于绑定方法,还绑定第一个参数(通常命名为
self
)到关联的实例。返回一个dictis,将参数名称(包括*
和**
参数的名称,如果有的话)映射到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,)}True>>> getcallargs(f, a=2, x=4) == {"a": 2, "named": {"x": 4}, "b": 1, "pos": ()}True>>> getcallargs(f)Traceback (most recent call last):...TypeError: f() missing 1 required positional argument: "a"
版本3.2.
中的新版本自版本3.5以后删除:使用
Signature.bind()
和Signature.bind_partial()
代替
inspect.
getclosurevars
(func)-
在Python函数或方法中获取外部名称引用的映射func他们目前的价值观。一个名为tuple
ClosureVars(nonlocals, globals, builtins, unbound)
被退回。nonlocals将引用的名称映射到lexical closurevariables,globals映射到函数的模块globals和builtins从函数体可见的内置函数。unbound是函数中引用的名称集合,如果给定当前模块全局和内置函数,则根本无法解析.TypeError
如果func不是Python函数或方法.3.3版本中的新功能
解释器堆栈
当以下函数返回“帧记录”时,每条记录都是命名元组FrameInfo(frame, filename, lineno, function, code_context, index)
。元组包含框架对象,文件名,当前行的行号,函数名称,源代码中的上下文行列表以及该列表中当前行的索引.
更改版本3.5:返回一个命名元组而不是一个元组.
注意
对框架对象的引用,这些函数返回的framerecords的第一个元素中找到,可以使程序创建引用循环。一旦创建了一个参考周期,即使启用了Python的可选周期检测器,从形成周期的对象可以访问的所有对象的寿命也会变得更长。如果必须创建这样的循环,重要的是确保它们被明确地破坏以避免延迟的对象破坏和增加的内存消耗.
虽然循环检测器将捕获这些,但是框架的破坏(和局部变量)可以通过删除finally
子句中的循环来确定。如果在编译Python或使用gc.disable()
时禁用循环检测器,这也很重要。例如:
def handle_stackframe_without_leak(): frame = inspect.currentframe() try: # do something with the frame finally: del frame
如果你想保持框架(例如打印跟踪器),你也可以使用frame.clear()
方法。
大多数这些函数支持的可选context参数指定要返回的上下文行数,它们以当前行为中心.
inspect.
getframeinfo
(frame, context=1)-
获取有关帧或回溯对象的信息。一个命名的元组
Traceback(filename, lineno, function, code_context, index)
被退回.
inspect.
getouterframes
(frame, context=1)-
获取帧和所有外部帧的帧记录列表。这些帧表示导致创建frame的调用。列表中的第一个条目代表frame;最后一个条目代表最外面的callon frame的stack.
inspect.
getinnerframes
(traceback, context=1 )-
获取回溯帧和所有内部帧的帧记录列表。这些帧表示由frame引起的调用。该清单中的第一个条目代表traceback;最后一个条目代表异常被提升的地方.
inspect.
stack
(context=1)-
返回调用者堆栈的帧记录列表。其中列表中的第一个条目代表调用者;最后一个条目表示堆栈中最外面的调用.
更改版本3.5:返回名单元组
FrameInfo(frame, filename, lineno, function, code_context, index)
的列表
inspect.
trace
// (context=1 )-
返回当前帧和当前正在处理异常的帧之间的堆栈帧记录列表。列表中的firstentry表示调用者;最后一个条目表示异常被提出的地方.
在版本3.5中更改:返回名为元组的列表
FrameInfo(frame, filename, lineno, function, code_context, index)
返回
静态获取属性
两者getattr()
和hasattr()
可以在获取或检查属性是否存在时触发代码执行。将调用描述符,如属性,并且可以调用__getattr__()
和__getattribute__()
.
对于需要被动内省的情况,例如文档工具,这可能会很不方便。getattr_static()
与getattr()
具有相同的签名但避免在获取属性时执行代码.
inspect.
getattr_static
(obj, attr, default=None)-
检索属性而不通过描述符协议触发动态查找,
__getattr__()
或__getattribute__()
.注意:此函数可能无法检索getattr可以获取的所有属性(如动态创建的属性),并且可能找到getattr无法获取的属性(如引发属性错误的描述符)。它也可以返回描述符对象而不是实例成员.
如果实例
__dict__
被另一个成员(例如属性)遮蔽,那么这个函数将无法找到instancemembers.版本3.2.
getattr_static()
中的新增功能不会解析描述符,例如在C中实现的对象上的插槽描述符或集合描述符。返回描述符对象而不是基础属性.
您可以使用代码如下。请注意,对于任意getset描述符,调用它们可能会触发代码执行:
# example code for resolving the builtin descriptor typesclass _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
(generator)-
获取发电机的当前状态 – 用户
- 可能的状态是:
-
- GEN_CREATED:等待开始执行.
- GEN_RUNNING:当前由翻译执行.
- GEN_SUSPENDED:目前暂停在一个屈服表达式.
- GEN_CLOSED:执行已完成.
新版本3.2.
inspect.
getcoroutinestate
(coroutine)-
获取协程对象的当前状态。该函数旨在与
async def
函数创建的协程对象一起使用,但是会接受任何具有cr_running
和cr_frame
属性- 可能的状态是:
-
- CORO_CREATED:等待开始执行
- CORO_RUNNING:当前正由翻译执行.
- CORO_SUSPENDED:当前暂停等待表达式.
- CORO_CLOSED:已完成执行.
新版本3.5.
还可以查询发电机的当前内部状态。这对于测试目的非常有用,以确保内部状态按预期更新:
inspect.
getgeneratorlocals
(generator)-
获取generator中的实时局部变量到其当前值的映射。返回一个从变量名映射到值的字典。这相当于调用
locals()
在发电机的机体中,所有相同的警告适用.如果generator是发电机没有当前相关的框架,那么一个空的字典被退回。
TypeError
如果generator不是Python生成器对象.CPython实现细节:这个函数依赖于生成器暴露Python堆栈帧以进行内省,但不能保证在Python的所有实现中都是如此。在这种情况下,这个函数总是会返回一个空字典.
3.3版本中的新功能
inspect.
getcoroutinelocals
// (coroutine)-
这个功能类似于
getgeneratorlocals()
,但由async def
函数创建的协程对象的工件.新版本3.5.
编码对象位标志
Python代码对象有一个co_flags
属性,它是以下标志的位图:
inspect.
CO_OPTIMIZED
-
使用快速本地优化代码对象.
inspect.
CO_NEWLOCALS
-
如果设置,新的字典将会为框架创建
f_locals
代码对象执行时
inspect.
CO_VARARGS
-
代码对象有一个可变位置参数(
*args
-like).
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 from
协同对象。参见 PEP 492 了解更多详情.版本3.5中的新功能.
inspect.
CO_ASYNC_GENERATOR
-
当代码对象是异步生成器函数时,将设置该标志。执行代码对象时,它返回一个异步生成器对象。见 PEP 525 了解更多详情.
新版本3.6.
注意
标志特定于CPython,可能不在otherPython实现中定义。此外,标志是一个实现细节,可以在将来的Python版本中删除或弃用。建议使用inspect
模块中的公共API以满足任何内省需求.
评论被关闭。