inspect模塊---檢查活動對象


 

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等)的如下屬性: 

Type Attribute Description Notes
module __doc__ documentation string  
  __file__ filename (missing for built-in modules)  
class __doc__ documentation string  
  __module__ name of module in which this class was defined  
method __doc__ documentation string  
  __name__ name with which this method was defined  
  im_class class object that asked for this method (1)
  im_func or __func__ function object containing implementation of method  
  im_self or __self__ instance to which this method is bound, or None  
function __doc__ documentation string  
  __name__ name with which this function was defined  
  func_code code object containing compiled function bytecode  
  func_defaults tuple of any default values for arguments  
  func_doc (same as __doc__)  
  func_globals global namespace in which this function was defined  
  func_name (same as __name__)  
generator __iter__ defined to support iteration over container  
  close raises new GeneratorExit exception inside the generator to terminate the iteration  
  gi_code code object  
  gi_frame frame object or possibly None once the generator has been exhausted  
  gi_running set to 1 when generator is executing, 0 otherwise  
  next return the next item from the container  
  send resumes the generator and “sends” a value that becomes the result of the current yield-expression  
  throw used to raise an exception inside the generator  
traceback tb_frame frame object at this level  
  tb_lasti index of last attempted instruction in bytecode  
  tb_lineno current line number in Python source code  
  tb_next next inner traceback object (called by this level)  
frame f_back next outer frame object (this frame’s caller)  
  f_builtins builtins namespace seen by this frame  
  f_code code object being executed in this frame  
  f_exc_traceback traceback if raised in this frame, or None  
  f_exc_type exception type if raised in this frame, or None  
  f_exc_value exception value if raised in this frame, or None  
  f_globals global namespace seen by this frame  
  f_lasti index of last attempted instruction in bytecode  
  f_lineno current line number in Python source code  
  f_locals local namespace seen by this frame  
  f_restricted 0 or 1 if frame is in restricted execution mode  
  f_trace tracing function for this frame, or None  
code co_argcount number of arguments (not including * or ** args)  
  co_code string of raw compiled bytecode  
  co_consts tuple of constants used in the bytecode  
  co_filename name of file in which this code object was created  
  co_firstlineno number of first line in Python source code  
  co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg |8=**arg  
  co_lnotab encoded mapping of line numbers to bytecode indices  
  co_name name with which this code object was defined  
  co_names tuple of names of local variables  
  co_nlocals number of local variables  
  co_stacksize virtual machine stack space required  
  co_varnames tuple of names of arguments and local variables  
builtin __doc__ documentation string  
  __name__ original name of this function or method  
  __self__ instance to which a method is bound, or None  

 

2. inspect.getmoduleinfo(path): 返回一個命名元組<named tuple>(name, suffix, mode, module_type)

  name:模塊名(不包括其所在的package)

      suffix:

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

      module_type: 整數,代表了模塊的類型

3. 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)到相應的實例;返回字典,對應參數名及其值;

>>> 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) Traceback (most recent call last): ... TypeError: 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(),這些驗證函數。

看一個例子

 

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

 

 

 

執行的結果是

phase

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM