Python的类型注解Annotation

Python函数类型注解的方式

因为当Python用于大型项目时候,没有类型这个Python的特征的弱点就暴露出来,特别是项目中人员层次参差不齐,项目中就会产生各种bug。
虽然动态语言Python虽然无法解决没有类型的这个问题,但是它也做了一些折中方案。

加help文档(3.5以后)

def add(x, y) ->int: # 函数注释,非强制类型要求
    """
    :param x: int
    :param y: int
    :return: int
    """
    return x + y
help(add)
Help on function add in module __main__:

add(x:str, y:int) -> int
    :param x: int
    :param y: int
    :return: int

形参和返回值注解(Python3.5以上)

这仅仅是用声明,不是强制要求。Pycharm会根据这个指定类型做类型推断。

def add(x:int, y) ->int: # 函数注释,非强制类型要求
                            #x要求是int;add返回值要求是int。
    return x + y
help(add)

Help on function add in module __main__:

add(x:int, y) -> int

标识符注解(Python3.6以后)

a:int = 1

Python按照参数注解做类型检查

如果我们尝试用annotation做判断,可得到看似正确的结果,但问题是只有在Python3.6下字典才有被记录字典输入顺序。
不过,我们可以把这个需求作为一个练习:

def check(fn):
    def wrapper(*args, **kwargs):
        print(fn.__annotations__)
        list_anno_values = list(fn.__annotations__.values())
        print(list_anno_values)

        for index, para in enumerate(args):
            print(para, list_anno_values[index])  # 如果True说明送参类型正确
            print(isinstance(para, list_anno_values[index]))

        for k, v in kwargs.items():
            print(v, fn.__annotations__[str(k)]) # 如果True说明送参类型正确;False说明送参错误
            print(isinstance(v, fn.__annotations__[str(k)]))

            ret = fn(*args, **kwargs)
        return ret

    return wrapper


@check  # add = check(add) #add=>wrapper
def add(x: int, y: int) -> int:
    return x + y


add(4, y=5)
{'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}
[<class 'int'>, <class 'int'>, <class 'int'>]
4 <class 'int'>
True
5 <class 'int'>
True





9
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值