函数动静类型查看的装璜器代码

import inspectimport functoolsdef 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@typeHintsdef add(x: int, y: int) -> int:    return x + y@typeHintsdef add1(x, y:int) -> int:    return x + yprint(add(3, 5))    # 输入后果为8print(add1(1, 2))    # 输入后果为3

类型查看次要应用了inspect库。本次代码运行环境是python3.5.2。inspect库的应用办法在上面介绍。

<!--more-->

inspect模块

查看函数动静类型时,咱们次要应用的是inspect库中的signature类,parameter类。能够应用help办法查看inspect的详细信息:

import inspecthelp(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 + yimport inspectsig = inspect.signature(add)print(sig.parameters)print(sig.parameters['x'])print(sig.parameters.values())# 输入后果OrderedDict([('x', <Parameter "x:int">), ('y', <Parameter "y:int">)])x:intodict_values([<Parameter "x:int">, <Parameter "y:int">])

odict_values相似于list,然而不反对下表操作,因而须要用list()转化为list之后再做下表操作。


记得帮我点赞哦!

精心整顿了计算机各个方向的从入门、进阶、实战的视频课程和电子书,依照目录正当分类,总能找到你须要的学习材料,还在等什么?快去关注下载吧!!!

朝思暮想,必有回响,小伙伴们帮我点个赞吧,非常感谢。

我是职场亮哥,YY高级软件工程师、四年工作教训,回绝咸鱼争当龙头的斜杠程序员。

听我说,提高多,程序人生一把梭

如果有幸能帮到你,请帮我点个【赞】,给个关注,如果能顺带评论给个激励,将不胜感激。

职场亮哥文章列表:更多文章

自己所有文章、答复都与版权保护平台有单干,著作权归职场亮哥所有,未经受权,转载必究!