inspect模块

inspect模块提供了几个有用的函数来帮助获取关于活动对象的信息,比如模块、类、方法、函数、回溯、框架对象和代码对象。例如,它可以帮助您检查类的内容、检索方法的源代码、提取和格式化函数的参数列表,或者获得显示详细回溯所需的所有信息。

官网:https://docs.python.org/3/library/inspect.html

类型和成员

getmembers()函数检索对象(例如类或模块)的成员。名称以“是”开头的函数主要作为第二个参数的方便选择getmembers()它们还可以帮助您确定何时可以找到以下特殊属性:

类型

属性

描述

__doc__

文档字符串

 

__file__

文件名(内置模块缺少)

__doc__

文档字符串

 

__name__

用于定义此类的名称

 

__qualname__

合格的名字

 

__module__

定义此类的模块的名称

方法

__doc__

文档字符串

 

__name__

用于定义此方法的名称

 

__qualname__

合格的名字

 

__func__

包含方法实现的函数对象

 

__自__

此方法绑定的实例,或 None

function

__doc__

文档字符串

 

__name__

用于定义此函数的名称

 

__qualname__

合格的名字

 

__code__

包含已编译函数字节码的代码对象

 

__defaults__

位置或关键字参数的任何默认值的元组

 

__kwdefaults__

仅限关键字参数的任何默认值的映射

 

__globals__

定义此函数的全局命名空间

 

__annotations__

参数名称到注释的映射; "return"key保留用于返回注释。

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

跟踪此框架的功能,或 None

code

co_argcount

参数个数(不包括仅关键字参数,*或**参数)

 

co_code

原始编译字节码的字符串

 

co_cellvars

单元格变量名称的元组(由包含范围引用)

 

co_consts

字节码中使用的常量元组

 

co_filename

创建此代码对象的文件的名称

 

co_firstlineno

Python源代码中的第一行数

 

co_flags

CO_*标志的位图,在这里阅读更多

 

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

对象被迭代 ,或 yield fromNone

coroutine

__name__

名称

 

__qualname__

合格的名字

 

cr_await

正在等待的对象,或 None

 

cr_frame

 

cr_running

是的协程运行?

 

cr_code

 

cr_origin

coroutine创建的地方,或者None看到sys.set_coroutine_origin_tracking_depth()

内置

__doc__

文档字符串

 

__name__

此函数或方法的原始名称

 

__qualname__

合格的名字

 

__self__

绑定方法的实例,或 None

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

在版本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对象

如果对象是协程函数 (使用语法定义的函数),则返回true async def

版本3.5中的新功能。

inspect.iscoroutine对象

如果对象是函数创建 协程,则返回true async def

版本3.5中的新功能。

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对象

如果对象是一个返回true 异步发电机迭代 通过创建异步发电机的功能。

版本3.6中的新功能。

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 

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

inspect.getsource对象

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

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

inspect.cleandocdoc 

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

从第一行删除所有前导空格。可以从第二行开始均匀移除的任何前导空格都将被删除。随后删除开头和结尾处的空行。此外,所有选项卡都扩展为空格。

可调用的反思与Signature对象

版本3.3中的新功能。

Signature对象表示可调用对象的调用签名及其返回注释。要检索Signature对象,请使用该signature() 功能。

inspect.signaturecallable*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签名 callablecallable.__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签名,或者引发a TypeError

bind_partial* args** kwargs 

以相同的方式工作Signature.bind(),但允许省略一些必需的参数(模仿functools.partial()行为。)如果传递的参数与签名不匹配,则返回BoundArguments或引发a TypeError

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

返回Signature给定callable (或其子类)对象 obj通过follow_wrapped=False获得签名obj 而不打开其__wrapped__链。

此方法简化了子类化Signature

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

版本3.5中的新功能。

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

描述参数值如何绑定到参数。可能的值(可通过ParameterParameter.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中nameNone如果将参数对象设置为,允许参数对象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中的新功能。

argskwargs特性可被用于调用功能:

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.getclasstreeclassesunique = False 

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

inspect.getargspecfunc 

获取Python函数参数的名称和默认值。返回一个 命名元组 args是参数名称的列表。varargskeywords 是参数或的名称defaults是默认参数值的元组,或者如果没有默认参数; 如果这个元组有n个元素,它们对应args中列出的最后 n个元素ArgSpec(args, varargs, keywords, defaults)***NoneNone

自从3.0版本不推荐使用:使用getfullargspec()一个更新的API,它通常是一个简易替换,而且正确处理功能注释,只有关键字参数。

或者,使用signature()和 签名对象,它为可调用对象提供更结构化的内省API。

inspect.getfullargspecfunc 

获取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 2 inspect模块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是参数名称的列表。 varargskeywords参数或的名称。 locals是给定框架的locals字典。ArgInfo(args, varargs, keywords, locals)***None

注意

 

在Python 3.5中,此函数无意中被标记为已弃用。

inspect.formatargspecARGS [可变参数varkw默认值kwonlyargskwonlydefaults注释[formatargformatvarargsformatvarkwformatvalueformatreturnsformatannotations 

从返回的值格式化漂亮的参数规范 getfullargspec()

前七个参数是(argsvarargsvarkw, defaultskwonlyargskwonlydefaultsannotations)。

其他六个参数是被调用的函数,分别用于将参数名称, *参数名称,**参数名称,默认值,返回注释和单个注释转换为字符串。

例如:

from inspect import formatargspec, getfullargspec
def f(a: int, b: float):
    pass
print(formatargspec(*getfullargspec(f)))

从版本3.5开始不推荐使用:使用signature()和 签名对象,它为callables提供了更好的内省API。

inspect.formatargvaluesargs [varargsvarkwlocalsformatargformatvarargsformatvarkwformatvalue 

从返回的四个值格式化漂亮的参数规范 getargvalues()格式*参数是相应的可选格式化函数,用于将名称和值转换为字符串。

注意

 

在Python 3.5中,此函数无意中被标记为已弃用。

inspect.getmrocls 

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

inspect.getcallargsfunc* args** kwds 

argskwds绑定到Python函数或方法func的参数名称,就像使用它们调用它一样。对于绑定方法,还将第一个参数(通常是命名self绑定到关联实例。返回一个dict,将参数名称(包括*和 **参数的名称,如果有的话)映射argskwds的值如果错误地调用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.getclosurevarsfunc 

获取Python函数或方法函数中的外部名称引用到其当前值的映射 返回一个 命名元组 nonlocals将引用的名称映射到词法闭包变量,将globals引用到函数的模块全局变量,并将内置函数映射到函数体可见的内置函数。unbound是函数中引用的名称集,在给定当前模块globals和builtins的情况下根本无法解析。ClosureVars(nonlocals, globals, builtins, unbound)

TypeError如果func不是Python函数或方法,则引发此异常

版本3.3中的新功能。

inspect.unwrapfunc*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.getframeinfoframecontext = 1 

获取有关帧或回溯对象的信息。返回一个命名元组 Traceback(filename, lineno, function, code_context,index)

inspect.getouterframesframecontext = 1 

获取帧和所有外部帧的帧记录列表。这些帧表示导致产生的呼叫返回列表中的第一个条目表示框架 ; 最后一个条目表示堆栈的最外层调用

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

inspect.getinnerframestracebackcontext = 1 

获取回溯帧和所有内部帧的帧记录列表。这些帧表示作为结果的调用列表中的第一个条目代表追溯 ; 最后一个条目表示引发异常的位置。

在版本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.tracecontext = 1 

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

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

静态获取属性

getattr()hasattr()提取或检查属性的存在时可以触发代码的执行。描述符和属性一样,将被调用,__getattr__()并且__getattribute__() 可以被调用。

对于需要被动内省的情况,例如文档工具,这可能很不方便。getattr_static()具有相同的签名,getattr() 但避免在获取属性时执行代码。

inspect.getattr_staticobjattr默认=无

检索属性而不通过描述符协议触发动态查找,__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

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

posted @ 2019-06-14 00:19  码迷-wjz  阅读(1286)  评论(0)    收藏  举报