Python 类型注解,python变量也能声明类型

类型注解

注意:3.6以上版本

  • 动态语言不需要声明变量类型,这种做法在很多人眼里是不好不好维护的代名词
  • 变量的类型说明,一般情况下我们会通过变量名来隐含的说明该变量的类型:user_list, user_dict
age: int = 18  # age是int类型
print(age)

Python有大量的内置类型:int float bool str bytes list dict 等都可以

但是:类型的声明,不会实际影响使用,仅是提示作用,不会限制类型。

例如这样:

a_dict = True
age: int= 10.25

不会报错!正常使用。使用pycharm会有提示作用,仅是一种规范。

复杂数据类型

当想指明list,dict里面的类型

a_dict: dict = {}
a_list:list=[1,2,3,4]

这样只能指明外面的类型,里面的不行!

想要指明出里面的类型,可以这样写:

from typing import List, Dict, Set, Tuple

course: List[str] = ['django', 'flask', 'tornado', 'scrapy']
course.append(1)  # 这样也可以使用不会报错,仅是提示作用
print(course)

user_info: Dict[str, float] = {"tony": 18, "Nick": 20.5}

nums: Tuple[int, ...] = (1, 2, 3) # 任意int放入用...就可以
nums: Tuple[int] = (1) # 只能放1个

所有的提示,都是pycharm提示的,不是python语言提供

函数参数的类型声明

同样仅是提示作用,不会强制检查

def add1(a: int, b: int) -> int:
    return a + b
    
def add2(a: int, b: float) -> float:
    return a + b

if __name__ == '__main__':
    from typing import get_type_hints
    print(add1.__annotations__)  # {'a': <class 'int'>, 'b': <class 'int'>, 'return': <class 'int'>}
    print(get_type_hints(add2))  # {'a': <class 'int'>, 'b': <class 'float'>, 'return': <class 'float'>}

自定义函数的类型判断

def validate_input(obj, **kwargs):
    hints = get_type_hints(obj)
    for para_name, para_type in hints.items():
        if para_name == "return":
            continue
        if not isinstance(kwargs[para_name], para_type):
            raise TypeError("参数:{},类型错误!应该是:{}".format(para_name, para_type))


def add1(a: int, b: int) -> int:
    validate_input(add1, a=a, b=b)
    return a + b

if __name__ == '__main__':
    print(add1(1, 2))
    print(add1(1, 2.1)) # TypeError: 参数:b,类型错误!应该是:<class 'int'>

写的不够优雅,都写到函数人家里面了!这时候大家应该知道怎么改了吧!用上我们的装饰器

from typing import get_type_hints
from functools import wraps
from inspect import getfullargspec


def validate_input(obj, **kwargs):
    hints = get_type_hints(obj)
    for para_name, para_type in hints.items():
        if para_name == "return":
            continue
        if not isinstance(kwargs[para_name], para_type):
            raise TypeError("参数:{},类型错误!应该是:{}".format(para_name, para_type))


def type_check(decorator):
    @wraps(decorator)
    def wrapped_decorator(*args, **kwargs):
        func_args = getfullargspec(decorator)[0]
        kwargs.update(dict(zip(func_args, args)))

        validate_input(decorator, **kwargs)
        return decorator(**kwargs)
    return wrapped_decorator


@type_check
def add1(a: int, b: int) -> int:
    validate_input(add1, a=a, b=b)
    return a + b

if __name__ == '__main__':
    print(add1(1, 2))
    print(add1(1, 2.1))

调用的时候才能发现问题,但是静态语言在编译的时候,就能知道错误。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小叶柏杉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值