专栏首页大猪的笔记python笔记:类型检验

python笔记:类型检验

在python3中,可以使用函数注解,类似这样:

def print(input :str) -> int:
    pass

函数注解可以用内置方法获取,所以可以利用这个特性做一个类型检验的装饰器。 代码如下:

import functools
import inspect

def typeassert(fn):
    """
    provide type assert, examples:

    #normal
    @typeassert
    def hello(name: str):
        return name + "world"

    #check return
    @typeassert
    def hello2(name: str, count: int=5) -> (int, int, int):
        print("{} {} say hello".format(count, name))
        return 0, 1, 2

    :param fn:input funcs
    :return:
    """
    @functools.wraps(fn)
    def wrap(*args, **kwargs):
        sig = inspect.signature(fn)
        parameters = sig.bind_partial(*args, **kwargs).arguments.items()
        anno = fn.__annotations__
        for element_name, value in parameters:
            if element_name in anno:
                if not isinstance(value, anno[element_name]):
                    raise TypeError(
                        "{}:{} type not {}".format(element_name, value, anno[element_name])
                        )

        ret = fn(*args, **kwargs)
        if 'return' not in anno:
            return ret

        anno_return = anno['return']
        if isinstance(anno_return, type):
            if not isinstance(ret, anno_return):
                raise TypeError("return value {} != {}".format(ret, anno_return))
        elif isinstance(anno_return, (list, tuple)):
            if len(ret) != len(anno_return):
                raise TypeError("return value count {} != {}".format(len(ret), len(anno_return)))
            for key, ret_value in enumerate(ret):
                if not isinstance(ret_value, anno_return[key]):
                    raise TypeError(
                        "return value index:{}({}) type not {}".format(key, ret_value, anno_return[key])
                        )
        return ret
    return wrap

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C#笔记:RC6算法实现

    超级大猪
  • go 自定义排序

    超级大猪
  • go:将mysql返回数据转换为一个字典数组

    go官方库返回的是一个rows对象,非常蛋疼。 写了一个很神奇的函数,把返回值db.Rows转换成[]map[string]interface{}结构。

    超级大猪
  • java的poi技术读取Excel[2003-2007,2010]

    这篇blog主要是讲述java中poi读取excel,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为:xls和xlsx。

    Hongten
  • 成立不到三年,这家公司不仅成了全球第一,还获克强总理称赞

    昨天,CCTV-1新闻联播的一段画面引起了科技界人士的热议。原来是4月25日下午,李克强总理体验了全球首款支持3D的LED光源1080p全高清无屏电视极米H1。...

    曾响铃
  • Java基础系列(四十):集合之AbstractCollection

    (PS:上周由于准备自考,更新延误了一些,见谅!) AbstractCollection类是Collection接口的一个实现类,它只是为了给我们提供了一些最基...

    山禾说
  • 简单算法杂例

    第一:如果B栈为空,那么将A中的所有元素依次弹出后放入B栈中(负负为正,FILO顺序颠倒,再颠倒依次就为原始的顺序),此时B栈中已经有了元素,弹出的方式见“第二...

    大学里的混子
  • Java生成二维码

    JAVA葵花宝典
  • 剑指Offer-平衡二叉树

    package Tree; /** * 平衡二叉树 * 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 * 平衡二叉树(Balanced Binary ...

    武培轩
  • Java 最常见的 208 道面试题:第七模块答案

    throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理。而throw则是指抛出的一个具...

    Java团长

扫码关注云+社区

领取腾讯云代金券