inspect模块主要提供了四种用处:
(1). 对是否是模块,框架,函数等进行类型检查。
(2). 获取源码
(3). 获取类或函数的参数的信息
(4). 解析堆栈
# -*-coding:UTF-8 -*-
import inspect
def a(a, b=0, *c, d, e=1, **f):
pass
aa = inspect.signature(a)
print("inspect.signature(fn)是:%s" % aa)
print("inspect.signature(fn)的类型:%s" % (type(aa)))
print("\n")
bb = aa.parameters
print("signature.paramerters属性是:%s" % bb)
print("ignature.paramerters属性的类型是%s" % type(bb))
print("\n")
for cc, dd in bb.items():
print("mappingproxy.items()返回的两个值分别是:%s和%s" % (cc, dd))
print("mappingproxy.items()返回的两个值的类型分别是:%s和%s" % (type(cc), type(dd)))
print("\n")
ee = dd.kind
print("Parameter.kind属性是:%s" % ee)
print("Parameter.kind属性的类型是:%s" % type(ee))
print("\n")
gg = dd.default
print("Parameter.default的值是: %s" % gg)
print("Parameter.default的属性是: %s" % type(gg))
print("\n")
ff = inspect.Parameter.KEYWORD_ONLY
print("inspect.Parameter.KEYWORD_ONLY的值是:%s" % ff)
print("inspect.Parameter.KEYWORD_ONLY的类型是:%s" % type(ff))
运行结果:
inspect.signature(fn)是:(a, b=0, *c, d, e=1, **f)
inspect.signature(fn)的类型:<class 'inspect.Signature'>
signature.paramerters属性是:OrderedDict([('a', <Parameter "a">), ('b', <Parameter "b=0">), ('c', <Parameter "*c">), ('d', <Parameter "d">), ('e', <Parameter "e=1">), ('f', <Parameter "**f">)])
ignature.paramerters属性的类型是<class 'mappingproxy'>
mappingproxy.items()返回的两个值分别是:a和a
mappingproxy.items()返回的两个值的类型分别是:<class 'str'>和<class 'inspect.Parameter'>
Parameter.kind属性是:POSITIONAL_OR_KEYWORD
Parameter.kind属性的类型是:<enum '_ParameterKind'>
Parameter.default的值是: <class 'inspect._empty'>
Parameter.default的属性是: <class 'type'>
mappingproxy.items()返回的两个值分别是:b和b=0
mappingproxy.items()返回的两个值的类型分别是:<class 'str'>和<class 'inspect.Parameter'>
Parameter.kind属性是:POSITIONAL_OR_KEYWORD
Parameter.kind属性的类型是:<enum '_ParameterKind'>
Parameter.default的值是: 0
Parameter.default的属性是: <class 'int'>
mappingproxy.items()返回的两个值分别是:c和*c
mappingproxy.items()返回的两个值的类型分别是:<class 'str'>和<class 'inspect.Parameter'>
Parameter.kind属性是:VAR_POSITIONAL
Parameter.kind属性的类型是:<enum '_ParameterKind'>
Parameter.default的值是: <class 'inspect._empty'>
Parameter.default的属性是: <class 'type'>
mappingproxy.items()返回的两个值分别是:d和d
mappingproxy.items()返回的两个值的类型分别是:<class 'str'>和<class 'inspect.Parameter'>
Parameter.kind属性是:KEYWORD_ONLY
Parameter.kind属性的类型是:<enum '_ParameterKind'>
Parameter.default的值是: <class 'inspect._empty'>
Parameter.default的属性是: <class 'type'>
mappingproxy.items()返回的两个值分别是:e和e=1
mappingproxy.items()返回的两个值的类型分别是:<class 'str'>和<class 'inspect.Parameter'>
Parameter.kind属性是:KEYWORD_ONLY
Parameter.kind属性的类型是:<enum '_ParameterKind'>
Parameter.default的值是: 1
Parameter.default的属性是: <class 'int'>
mappingproxy.items()返回的两个值分别是:f和**f
mappingproxy.items()返回的两个值的类型分别是:<class 'str'>和<class 'inspect.Parameter'>
Parameter.kind属性是:VAR_KEYWORD
Parameter.kind属性的类型是:<enum '_ParameterKind'>
Parameter.default的值是: <class 'inspect._empty'>
Parameter.default的属性是: <class 'type'>
inspect.Parameter.KEYWORD_ONLY的值是:KEYWORD_ONLY
inspect.Parameter.KEYWORD_ONLY的类型是:<enum '_ParameterKind'>
inspect.signature(fn)
将返回一个inspect.Signature
类型的对象,值为fn这个函数的所有参数
inspect.Signature
对象的paramerters
属性是一个mappingproxy
(映射)类型的对象,值为一个有序字典(Orderdict)。
这个字典里的key是即为参数名,str
类型
这个字典里的value是一个inspect.Parameter
类型的对象,根据我的理解,这个对象里包含的一个参数的各种信息
inspect.Parameter
对象的kind属性是一个_ParameterKind
枚举类型的对象,值为这个参数的类型(可变参数,关键词参数,etc)
inspect.Parameter
对象的default
属性:如果这个参数有默认值,即返回这个默认值,如果没有,返回一个inspect._empty
类。
inspect.ArgInfo inspect.getmoduleinfo
inspect.ArgSpec inspect.getmodulename
inspect.Arguments inspect.getmro
inspect.Attribute inspect.getouterframes
inspect.BlockFinder inspect.getsource
inspect.CO_GENERATOR inspect.getsourcefile
inspect.CO_NESTED inspect.getsourcelines
inspect.CO_NEWLOCALS inspect.imp
inspect.CO_NOFREE inspect.indentsize
inspect.CO_OPTIMIZED inspect.isabstract
inspect.CO_VARARGS inspect.isbuiltin
inspect.CO_VARKEYWORDS inspect.isclass
inspect.EndOfBlock inspect.iscode
inspect.ModuleInfo inspect.isdatadescriptor
inspect.TPFLAGS_IS_ABSTRACT inspect.isframe
inspect.Traceback inspect.isfunction
inspect.attrgetter inspect.isgenerator
inspect.classify_class_attrs inspect.isgeneratorfunction
inspect.cleandoc inspect.isgetsetdescriptor
inspect.currentframe inspect.ismemberdescriptor
inspect.dis inspect.ismethod
inspect.findsource inspect.ismethoddescriptor
inspect.formatargspec inspect.ismodule
inspect.formatargvalues inspect.isroutine
inspect.getabsfile inspect.istraceback
inspect.getargs inspect.joinseq
inspect.getargspec inspect.linecache
inspect.getargvalues inspect.modulesbyfile
inspect.getblock inspect.namedtuple
inspect.getcallargs inspect.os
inspect.getclasstree inspect.re
inspect.getcomments inspect.stack
inspect.getdoc inspect.string
inspect.getfile inspect.strseq
inspect.getframeinfo inspect.sys
inspect.getinnerframes inspect.tokenize
inspect.getlineno inspect.trace
inspect.getmembers inspect.types
inspect.getmodule inspect.walktree
其中
isxxx之类的就是检查对象是否为xxx的函数吧
例如 检查this是否是一个模块
In [16]: inspect.ismodule(this)
Out[16]: True
getxxx之类的就是获取对象的xxx属性吧
例如
In [17]: inspect.getmodule(this)
Out[17]: <module 'this' from '/usr/lib/python2.7/this.pyc'>
__module__
属性只返回字符串而遗憾吗?这个方法一定可以满足你,它返回object的定义所在的模块对象。cls.__mro__
结果一样。但旧式类没有__mro__
这个属性,直接使用这个属性会报异常,所以这个方法还是有它的价值的。 返回当前的栈帧对象。