前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python的inspect模块

python的inspect模块

作者头像
周小董
发布2019-03-25 11:20:51
1.9K0
发布2019-03-25 11:20:51
举报
文章被收录于专栏:python前行者

inspect模块主要提供了四种用处:

(1). 对是否是模块,框架,函数等进行类型检查。

(2). 获取源码

(3). 获取类或函数的参数的信息

(4). 解析堆栈

代码语言:javascript
复制
# -*-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))

运行结果:

代码语言:javascript
复制
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模块类

代码语言:javascript
复制
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是否是一个模块

代码语言:javascript
复制
In [16]: inspect.ismodule(this)

Out[16]: True

getxxx之类的就是获取对象的xxx属性吧

例如

代码语言:javascript
复制
In [17]:  inspect.getmodule(this)

Out[17]: <module 'this' from '/usr/lib/python2.7/this.pyc'>

获取对象信息

  • getmembers(object[, predicate]): 这个方法是dir()的扩展版,它会将dir()找到的名字对应的属性一并返回,形如[(name, value), …]。另外,predicate是一个方法的引用,如果指定,则应当接受value作为参数并返回一个布尔值,如果为False,相应的属性将不会返回。使用is*作为第二个参数可以过滤出指定类型的属性。
  • getmodule(object): 还在为第2节中的__module__属性只返回字符串而遗憾吗?这个方法一定可以满足你,它返回object的定义所在的模块对象。
  • get{file|sourcefile}(object): 获取object的定义所在的模块的文件名|源代码文件名(如果没有则返回None)。用于内建的对象(内建模块、类、函数、方法)上时会抛出TypeError异常。
  • get{source|sourcelines}(object): 获取object的定义的源代码,以字符串|字符串列表返回。代码无法访问时会抛出IOError异常。只能用于module/class/function/method/code/frame/traceack对象。
  • getargspec(func): 仅用于方法,获取方法声明的参数,返回元组,分别是(普通参数名的列表, 参数名, *参数名, 默认值元组)。如果没有值,将是空列表和3个None。如果是2.6以上版本,将返回一个命名元组(Named Tuple),即除了索引外还可以使用属性名访问元组中的元素。
  • getargvalues(frame): 仅用于栈帧,获取栈帧中保存的该次函数调用的参数值,返回元组,分别是(普通参数名的列表, 参数名, *参数名, 帧的locals())。如果是2.6以上版本,将返回一个命名元组(Named Tuple),即除了索引外还可以使用属性名访问元组中的元素。
  • getcallargs(func[, *args][, **kwds]): 返回使用args和kwds调用该方法时各参数对应的值的字典。这个方法仅在2.7版本中才有。
  • getmro(cls): 返回一个类型元组,查找类属性时按照这个元组中的顺序。如果是新式类,与cls.__mro__结果一样。但旧式类没有__mro__这个属性,直接使用这个属性会报异常,所以这个方法还是有它的价值的。 返回当前的栈帧对象。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年08月01日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 总结
  • inspect模块类
    • 获取对象信息
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档