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': , 'b': , 'return': }
    print(get_type_hints(add2))  # {'a': , 'b': , 'return': }

自定义函数的类型判断

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,类型错误!应该是:

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

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))

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

你可能感兴趣的:(Python知识点,python,开发语言,后端)