inspect模块---检查活动对象

枫铃3年前 (2021-06-26)Python280

[inspect]模块提供了一些有用的函数来帮助获取有关活动对象(如模块,类,方法,函数,跟踪,框架对象和代码对象)的信息。例如,它可以帮助您检查类的内容,检索方法的源代码,提取和格式化函数的参数列表,或获取显示详细追溯所需的所有信息。

这个模块提供了四种主要的服务:

类型检查,

获取源代码,

检查类和函数,

以及检查解释器堆栈

一、type and members

  1. inspect.``getmembers`(object[, predicate])

第二个参数通常可以根据需要调用如下16个方法;

返回值为object的所有成员,以(name,value)对组成的列表

inspect.ismodule(object): 是否为模块

inspect.isclass(object):是否为类

inspect.ismethod(object):是否为方法(bound method written in python)

inspect.isfunction(object):是否为函数(python function, including lambda expression)

inspect.isgeneratorfunction(object):是否为python生成器函数

inspect.isgenerator(object):是否为生成器

inspect.istraceback(object): 是否为traceback

inspect.isframe(object):是否为frame

inspect.iscode(object):是否为code

inspect.isbuiltin(object):是否为built-in函数或built-in方法

inspect.isroutine(object):是否为用户自定义或者built-in函数或方法

inspect.isabstract(object):是否为抽象基类

inspect.ismethoddescriptor(object):是否为方法标识符

inspect.isdatadescriptor(object):是否为数字标识符,数字标识符有__get____set__属性; 通常也有__name__和__doc__属性

inspect.isgetsetdescriptor(object):是否为getset descriptor

inspect.ismemberdescriptor(object):是否为member descriptor

inspect的getmembers()方法可以获取对象(module、class、method等)的如下属性:

TypeAttributeDescriptionNotesmoduledocdocumentation stringfilefilename (missing for built-in modules)classdocdocumentation stringmodulename of module in which this class was definedmethoddocdocumentation stringnamename with which this method was definedim_classclass object that asked for this method(1)im_func or funcfunction object containing implementation of methodim_self or selfinstance to which this method is bound, or Nonefunctiondocdocumentation stringnamename with which this function was definedfunc_codecode object containing compiled function bytecodefunc_defaultstuple of any default values for argumentsfunc_doc(same as doc)func_globalsglobal namespace in which this function was definedfunc_name(same as name)generatoriterdefined to support iteration over containercloseraises new GeneratorExit exception inside the generator to terminate the iterationgi_codecode objectgi_frameframe object or possibly None>
  • inspect.``getmoduleinf``o(path): 返回一个命名元组(name, suffix, mode, module_type)
  • name:模块名(不包括其所在的package)

    ​ suffix:

    ​ mode:open()方法的模式,如:‘r’, 'a’等

    ​ module_type: 整数,代表了模块的类型

    1. inspect.``getmodulename(path):根据path返回模块名(不包括其所在的package)

    二、Retrieving source code

    1. inspect.getdoc`(object): 获取object的documentation信息

    2. inspect.``getcomments`(object)

    3. inspect.``getfile`(object): 返回对象的文件名

    4. inspect.``getmodule(object):返回object所属的模块名

    5. inspect.``getsourcefile(object): 返回object的python源文件名;object不能使built-in的module, class, mothod

    6. inspect.``getsourcelines(object):返回object的python源文件代码的内容,行号+代码行

    7. inspect.``getsource(object):以string形式返回object的源代码

    8. inspect.``cleandoc(doc):

    三、class and functions

    1. inspect.``getclasstree(classes[, unique])

    2. inspect.``getargspec(func)

    3. inspect.``getargvalues(frame)

    4. inspect.``formatargspec(args[, varargs, varkw, defaults, formatarg, formatvarargs, formatvarkw, formatvalue, join])

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

    6. inspect.``getmro(cls): 元组形式返回cls类的基类(包括cls类),以method resolution顺序;通常cls类为元素的第一个元素

    7. inspect.``getcallargs`(func[, *args][, **kwds]):将args和kwds参数到绑定到为func的参数名;对bound方法,也绑定第一个参数(通常为self)到相应的实例;返回字典,对应参数名及其值;

    '''
    遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
     >> from inspect import getcallargs
     >> def f(a, b=1, *pos, **named):
     ..     pass
     >> getcallargs(f, 1, 2, 3)
     'a': 1, 'named': {}, 'b': 2, 'pos': (3,)}
     >> getcallargs(f, a=2, x=4)
     'a': 2, 'named': {'x': 4}, 'b': 1, 'pos': ()}
     >> getcallargs(f)
     raceback (most recent call last):
     ..
     ypeError: f() takes at least 1 argument (0 given)
    

    四、The interpreter stack

    1. inspect.``getframeinfo(frame[, context])

    2. inspect.``getouterframes(frame[, context])

    3. inspect.``getinnerframes(traceback[, context])

    4. inspect.``currentframe()

    5. inspect.``stack([context])

    6. inspect.``trace([context])

    今天看RYU源码时,发现一个inspect模块,RYU使用了该模块的getmembers函数来获取ryu app的app类。

    函数原型是 inspect.getmembers(object[, predicate])

    功能: 从一个Object中获取符合predicate的元素的list,元素的形式是(name,value)
    predicate可以是ismodule(), isclass(), ismethod(), isfunction(), isgeneratorfunction(),
    isgenerator(), istraceback(), isframe(), iscode(), isbuiltin(),isroutine(),这些验证函数。

    看一个例子

    '''
    遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
    import inspect 
    class C():
         class CC():
            def foo3():
            print "foo3"
         def foo():
            print "foo"
        def foo2():
            print "foo2"
    cls = inspect.getmembers(C,inspect.ismethod)
    print cls
    

    相关文章

    Python集合list,tuple,dict,set

    Python四中集合list,tuple,dict,set list(有数组越界问题) 创建list࿱...

    Python传入参数的几种方法

    Python传入参数的几种方法

    写在前面 Python唯一支持的参数传递方式是『共享传参』(call by sharing) 多数面向对象语言都采用这一模式&...

    使用tf.print()打印tensor内容

    使用tf.print()打印tensor内容

    使用tf.Print()打印tensor内容,这是tensorflow中调试bug的一个手段,例子如下所示: &#...

    python基础对list的增删查改和列表的排序

    1.对list的增加,这个主要有三种方式 (1).采用append方法,append方法是在list...

    发表评论

    访客

    看不清,换一张

    ◎欢迎参与讨论,请在这里发表您的看法和观点。