inspect– 检查实时对象

源代码 Lib / inspect.py


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.5中更改:添加__qualname__gi_yieldfrom属性到生成器.

生成器__name__属性现在是从函数名而不是代码名设置的,现在可以修改它.

在版本3.7中更改:cr_origin属性添加到coroutines.

inspect.getmembersobject [, predicate]

返回按名称排序的(名称,值)对列表中对象的所有成员。如果提供了可选的predicate参数,则只包含谓词返回true值的成员.

注意

getmembers()只返回参数为时在类中定义的类属性一个类和那些属性已经列在元类’custom __dir__().

inspect.getmodulenamepath

返回文件名path命名的模块的名称,没有包括封闭包的名称。根据importlib.machinery.all_suffixes()中的所有条目检查文件扩展名。如果匹配,则返回最终路径组件并删除扩展名。否则,None返回.

注意这个函数only为actualPython模块返回一个有意义的名称 -可能引用Python包的路径将返回None.

在版本3.3中更改:该函数直接基于importlib.

inspect.ismoduleobject

如果对象是模块,则返回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.isawaitableobject

如果对象可以在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.isasyncgen (object)

如果对象异步,则返回true发生器迭代器异步发生器创建功能

3.6版本中的新功能

inspect.istraceback// (object)

如果物体是追溯物,则返回真实.

inspect.isframe (object )

如果对象是框架,则返回true。

inspect.iscode (object)

如果对象是代码,则返回true.

inspect.isbuiltin(object

如果对象是内置函数或绑定内置方法,则返回true.

inspect.isroutine(object)

如果object是用户定义的或内置的函数或方法.

inspect.isabstract (object )

如果对象是抽象基类,则返回true .

inspect.ismethoddescriptorobject

如果对象是方法描述符,则返回true,但如果ismethod(), isclass(), isfunction()要么 isbuiltin()是真的

例如,这对于int.__add__。通过此测试的对象有__get__()方法但不是__set__()方法,但除此之外,属性集也各不相同。一个__name__属性通常是不可见的,而__doc__经常是

通过描述符实现的方法也通过其他测试中的一个从ismethoddescriptor()测试中返回false,仅仅是因为其他测试承诺更多 – 例如,你可以依靠具有__func__属性(等)的时候一个对象传递ismethod().

inspect.isdatadescriptorobject

如果对象是数据描述符,则返回true。

数据描述符同时具有__get____set__方法。示例是属性(在Python中定义),getsets和成员。Thelatter 2在C中定义,并且有更多特定的测试可用于类型,这在Python实现中是健壮的。通常,datadescriptors也会有__name____doc__属性(属性,getsets和成员都具有这两个属性),但这不保证.

inspect.isgetsetdescriptor (object

如果对象是getset描述符,则返回true。

CPython实现细节: getsets是扩展模块中通过PyGetSetDef结构定义的属性。对于没有这种类型的Python实现,此方法将始终返回False.

inspect.ismemberdescriptorobject

如果对象是成员描述符,则返回true。

CPython实现细节:成员描述符是扩展模块中定义的属性PyMemberDef结构对于没有这种类型的Python实现,此方法将始终返回False.

检索源代码

inspect.getdocobject

获取对象的文档字符串,清理用cleandoc()。如果没有提供对象的文档字符串,并且对象是类,方法,属性或描述符,则从继承层次结构中检索documentationstring .

更改版本3.5:文档字符串现在如果不被覆盖则继承.

inspect.getcomments (object)

在单个字符串中返回对象源之前的任何注释行代码(用于类,函数或方法),或者在Python源文件的顶部(如果对象是模块)。如果对象的源代码不可用,则返回None。如果在C或交互式shell中定义了对象,则可能会发生这种情况.

inspect.getfileobject

返回定义了对象的(文本或二进制)文件的名称。这将失败并带有TypeError如果对象是内置模块,类或函数

inspect.getmoduleobject

试着猜出一个物体定义在哪个模块中.

inspect.getsourcefileobject

返回定义了对象的Python源文件的名称。这将失败TypeError如果对象是内置模块,类或函数

inspect.getsourcelinesobject

返回对象的源行和起始行号列表。该参数可以是模块,类,方法,函数,回溯,框架或代码对象。源代码作为对应于对象的行的列表返回,行号指示原始源文件中找到代码的第一行的位置。一个OSError如果无法检索源代码,则会引发.

在版本3.3中更改:OSError而不是IOError,现在是前者的别名

inspect.getsource//(object

返回对象的源代码文本。参数可以是模块,类,方法,函数,回溯,框架或代码对象。源代码作为单个字符串返回。一个OSError如果无法检索源代码,则会引发此问题.

改版3.3:OSError被提出而不是IOError,现在是theformer的形象.

inspect.cleandocdoc

清除文档字符串中的缩进,缩进以与代码块对齐.

从第一行删除所有前导空格。可以从第二行开始均匀移除的任何前导空格被移除。随后删除开头和结尾的空行。此外,所有标签都扩展到空间.

用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如果不支持那种类型的对象.

版本3.5:follow_wrapped参数。通过False专门得到callable的签名(callable.__wrapped__不会用到装饰的小号。)

注意

某些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*args, **kwargs

创建从位置和关键字参数到参数的映射。返回BoundArguments如果*args**kwargs匹配签名,或者引发TypeError.

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""
classmethod from_callableobj, *, follow_wrapped=True

返回Signature(或其子类)给定可调用的对象obj。通过follow_wrapped=False获得obj没有展开它__wrapped__链。

这个方法简化了Signature

class MySignature(Signature):    passsig = MySignature.from_callable(min)assert isinstance(sig, MySignature)

版本3.5中的新功能

class inspect.Parametername, kind, *, default=Parameter.empty, annotation=Parameter.empty

参数对象immutable。您可以使用Parameter.replace()创建修改后的副本.

在版本3.5中更改:参数对象是可选择的和可散列的

empty

一个特殊的类级别标记来指定缺少默认值和注释.

name

作为字符串的参数名称。名称必须是validPython标识符.

CPython实现细节: CPython生成表单.0用于实现理解和生成器表达式的代码对象.

更改版本3.6:这些参数名称由此模块公开为implicit0.

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的变化将反映在argskwargs.

应与Signature.parameters用于任何参数处理目的.

注意

跳过依赖于默认值的Signature.bind()Signature.bind_partial()的参数。但是,如果需要,请使用BoundArguments.apply_defaults()添加它们

args

位置参数值的元组。从arguments属性

kwargs

动态计算关键字参数值的字典。从arguments属性

signature

对父亲的引用Signature object.

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.

argskwargs属性可用于调用功能:

def test(a, *, b):    ...sig = signature(test)ba = sig.bind(10, b=20)test(*ba.args, **ba.kwargs)

参见

PEP 362 – 功能签名对象.
详细说明,实施细节和实例.

课程和功能

inspect.getclasstreeclasses, unique=False

将给定的类列表排列为嵌套列表的层次结构。在出现anested列表的地方,它包含从类中派生的类,该类的条目立即在列表之前。每个条目都是一个2元组,包含一个类和基类的元组。如果unique如果参数为true,则给定列表中每个类的返回结构中只显示一个条目。否则,使用多重继承的类及其后代将出现多次.

inspect.getargspecfunc

获取Python函数参数的名称和默认值。一个命名的元组 ArgSpec(args, varargs, keywords, defaults)被遗弃了。args是参数名称列表。varargskeywords***参数或None. defaults是默认参数值的元组或None如果没有默认参数;如果这个元组有n元素,它们对应的是n中列出的元素args.

从3.0版开始不推荐使用:使用 getfullargspec()对于更新的API,通常是一个插入替换,但也正确处理函数注释和关键字参数.

或者,使用signature()签名对象,为callables提供amore结构的内省API .

inspect.getfullargspec (func )

获取Python函数参数的名称和默认值。命名元组返回:

FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults,annotations)

args是位置参数名称列表.varargs*的名称参数或None如果不接受任意位置参数.varkw**参数的名称或None如果不接受任意关键字参数.defaultsn – 对应于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是参数名称的列表。varargskeywords***争论或None. locals是给定框架的thelocals字典.

注意

这个函数在Python 3.5中被无意中标记为已弃用.

inspect.formatargspecargs[, 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)"

自版本3.5以后不推荐使用使用signature()签名对象,为callables提供更好的内省API .

inspect.formatargvalues (args [, varargs, varkw, locals, formatarg, formatvarargs, formatvarkw, formatvalue])

getargvalues()。格式*参数是相应的可选格式化函数,用于将名称和值转换为字符串.

注意

这个函数在Python 3.5中被无意中标记为已弃用.

inspect.getmro (cls)

在方法解析顺序中返回类cls的基类元组,包括cls。在这个元组中没有类出现过多次。请注意,methodresolution顺序取决于cls的类型。除非使用非常特殊的用户定义的类型,否则cls将成为元组的第一个元素.

inspect.getcallargsfunc, *args, **kwds

argskwds绑定到Python函数ormethod func的参数名称,好像它被调用一样跟他们。对于绑定方法,还绑定第一个参数(通常命名为self)到关联的实例。返回一个dictis,将参数名称(包括***参数的名称,如果有的话)映射到argskwds的值。如果有人要求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版本中的新功能

inspect.unwrap// (func, *, stop=None)

获取func包裹的物体。它遵循__wrapped__属性链返回链中的最后一个对象.

stop是一个可选的回调接受包装链中的一个对象作为唯一的参数,允许在回调时提前终止解包返回一个真值。如果回调永远不会返回true值,则会像往常一样返回链中的最后一个对象。例如,如果链中的任何对象定义了signature()属性,__signature__使用它来停止展开。如果遇到一个循环,

ValueError会被抬起.

3.4版本中的新功能

解释器堆栈

当以下函数返回“帧记录”时,每条记录都是命名元组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.

更改版本3.5:一个列表名为元组FrameInfo(frame, filename, lineno, function, code_context, index)返回.

inspect.getinnerframes (traceback, context=1 )

获取回溯帧和所有内部帧的帧记录列表。这些帧表示由frame引起的调用。该清单中的第一个条目代表traceback;最后一个条目代表异常被提升的地方.

在版本3.5中更改:的列表 命名元组FrameInfo(frame, filename, lineno, function, code_context, index)归来了

inspect.currentframe

返回调用者堆栈框架的框架对象.

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

inspect.stackcontext=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.getgeneratorstategenerator

获取发电机的当前状态 – 用户

可能的状态是:
  • GEN_CREATED:等待开始执行.
  • GEN_RUNNING:当前由翻译执行.
  • GEN_SUSPENDED:目前暂停在一个屈服表达式.
  • GEN_CLOSED:执行已完成.

新版本3.2.

inspect.getcoroutinestatecoroutine

获取协程对象的当前状态。该函数旨在与async def函数创建的协程对象一起使用,但是会接受任何具有cr_runningcr_frame属性

可能的状态是:
  • CORO_CREATED:等待开始执行
  • CORO_RUNNING:当前正由翻译执行.
  • CORO_SUSPENDED:当前暂停等待表达式.
  • CORO_CLOSED:已完成执行.

新版本3.5.

还可以查询发电机的当前内部状态。这对于测试目的非常有用,以确保内部状态按预期更新:

inspect.getgeneratorlocalsgenerator

获取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以满足任何内省需求.

命令行界面

inspect模块还提供了命令行的基本内省功能.

默认情况下,接受模块的名称并打印该模块的源代码。可以打印模块中的类或函数,而不是通过冒号和目标对象的限定名称来打印.

--details

打印有关指定对象的信息而不是源代码

评论被关闭。