注意: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))
调用的时候才能发现问题,但是静态语言在编译的时候,就能知道错误。