即使一个人,也要活得像军队一样!

Python-- Inspect 模块简介

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

1.对是否是模块、框架、函数进行类型检查

2.获取源码

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

4.解析堆栈

一、type and members

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1). inspect.getmembers(object[, predicate]) 参数2调用如下16个方法;
# 返回值为object的所有成员,以(name,value)对组成的列表
2)inspect.getmembers()可以获取对象(module、classmethod等)属性

1.inspect.ismodule(object): 是否为模块
2.inspect.isclass(object): 是否为类
3.inspect.ismethod(object): 是否为方法(bound method written in python)
4.inspect.isfunction(object): 是否为函数(python function, including lambda expression)

5.inspect.isgeneratorfunction(object):是否为python生成器函数
6.inspect.isgenerator(object): 是否为生成器
7.inspect.istraceback(object): 是否为traceback
8.inspect.isframe(object): 是否为frame
9.inspect.iscode(object): 是否为code

10.inspect.isbuiltin(object): 是否为built-in函数或built-in方法
11.inspect.isroutine(object): 是否为用户自定义或者built-in函数或方法
12.inspect.isabstract(object): 是否为抽象基类
13.inspect.ismethoddescriptor(object):是否为方法标识符
14.inspect.isdatadescriptor(object): 是否为数字标识符,数字标识符有__get__ 和__set__属性;
通常也有__name__和__doc__属性
15.inspect.isgetsetdescriptor(object): 是否为getset descriptor
16.inspect.ismemberdescriptor(object):是否为member descriptor
1
2
3
4
5
2. inspect.getmoduleinfo(path):返回一个命名元组<named tuple>(name, suffix, mode, module_type)
  name:模块名(不包括其所在的package)
suffix:
mode:open()方法的模式,如:'r', 'a'
module_type: 整数,代表了模块的类型
1
3. inspect.getmodulename(path):根据path返回模块名(不包括其所在的package)

二、Retrieving source code

1
2
3
4
5
6
7
8
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
2
3
4
5
6
7
8
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)到相应的实例;返回字典,对应参数名及其值;

inspect的使用

1. 获取调用函数的实例

1
2
3
4
5
6
7
8
9
10
11
12
13
# file: util.py
def get_caller():
import inspect
try:
frame = inspect.currentframe()
call_frame = frame.f_back.f_back
call_frame_name = call_frame.f_code.co_varnames[0]
call_frame_self = call_frame.f_locals.get(call_frame_name, None)
except:
call_frame_self = None
finally:
del frame
return call_frame_self

2.登记注册函数

结合上篇说的装饰器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
def public(name=None):
if callable(name):
f = name
f._rpc_public_name = f.__name__
return f

def _(f):
f._rpc_public_name = name or f.__name__
return f

return _


class A(object):
def __init__(self):
self.method_map = {}
self.register_public_methods()

@public("hi")
def fun1(self):
print("hi , fun1")

@public("hello")
def fun2(self):
print("hello, fun2")

# 登记函数方法
def register_public_methods(self):
methods = inspect.getmembers(self, lambda f: callable(f) and hasattr(f, '_rpc_public_name'))
for name, f in methods:
self.add_method(f, f._rpc_public_name)

def add_method(self, fun, name):
self.method_map[name] = fun

if __name__ == "__main__":
a = A()
print(a.method_map)

# output
# {'hi': <bound method A.fun1 of <__main__.A object at 0x000001BBC6E0DB38>>, 'hello': <bound method A.fun2 of <__main__.A object at 0x000001BBC6E0DB38>>}

以上。
– end –

-------------本文结束感谢您的阅读-------------