函数动静类型查看的装璜器代码
import inspect
import functools
def typeHints(fn):
@functools.wraps(fn)
def wrap(*args, **kwargs):
sig = inspect.signature(fn)
params = sig.parameters
# 解决 kwargs:字典
for k, v in kwargs:
param = params[k]
if param.annotation != inspect._empty and not isinstance(v, param.annotation):
raise TypeError('parameter {} requires {}, but got {}'.format(k, param.annotation, type(v)))
# 解决 args:元组
for i, x in enumerate(args):
param = list(params.values())[i]
if param.annotation != inspect._empty and not isinstance(x, param.annotation):
raise TypeError('parameter {} requires {}, but got {}'.format(param.name, param.annotation, type(x)))
ret = fn(*args, **kwargs)
return ret
return wrap
@typeHints
def add(x: int, y: int) -> int:
return x + y
@typeHints
def add1(x, y:int) -> int:
return x + y
print(add(3, 5)) # 输入后果为 8
print(add1(1, 2)) # 输入后果为 3
类型查看次要应用了 inspect 库。本次代码运行环境是 python3.5.2。inspect 库的应用办法在上面介绍。
<!–more–>
inspect 模块
查看函数动静类型时,咱们次要应用的是 inspect 库中的 signature 类,parameter 类。能够应用 help 办法查看 inspect 的详细信息:
import inspect
help(inspect)
inspect 库的源代码见:/home/clg/.pyenv/versions/3.5.2/lib/python3.5/inspect.py
这个库用来获取 Python 动静对象的有用信息,比方本次用到的注解。
Signature 类
Signature 是 inspect 模块的一个类,inspect 模块的 signature 函数用来获取一个 Signature 对象,函数原型如下:
signature() - get a Signature object for the callable
Signature 类有一个属性是 OrderedDict 类型的 parameters,存储的是参数名称到参数对象(Parameter 类的对象)的一个有序映射。
Parameter 类
Parameter 类的对象次要用来组成 signature()返回的 Signature 对象的 parameters 属性。Parameter 类有两个罕用的属性:
- name :str 参数的名称
- annotation 参数的注解,如果没有注解,则 annotation 为
Parameter.empty
inspect 模块示例
def add(x: int, y: int) -> int:
return x + y
import inspect
sig = inspect.signature(add)
print(sig.parameters)
print(sig.parameters['x'])
print(sig.parameters.values())
# 输入后果
OrderedDict([('x', <Parameter "x:int">), ('y', <Parameter "y:int">)])
x:int
odict_values([<Parameter "x:int">, <Parameter "y:int">])
odict_values
相似于 list,然而不反对下表操作,因而须要用 list()
转化为 list 之后再做下表操作。
记得帮我点赞哦!
精心整顿了计算机各个方向的从入门、进阶、实战的视频课程和电子书,依照目录正当分类,总能找到你须要的学习材料,还在等什么?快去关注下载吧!!!
朝思暮想,必有回响,小伙伴们帮我点个赞吧,非常感谢。
我是职场亮哥,YY 高级软件工程师、四年工作教训,回绝咸鱼争当龙头的斜杠程序员。
听我说,提高多,程序人生一把梭
如果有幸能帮到你,请帮我点个【赞】,给个关注,如果能顺带评论给个激励,将不胜感激。
职场亮哥文章列表:更多文章
自己所有文章、答复都与版权保护平台有单干,著作权归职场亮哥所有,未经受权,转载必究!