1.类型标注是什么?为什么要用python的类型标注?
Python 是一种动态类型语言。这意味着 Python 解释器仅在代码运行时进行类型检查。
我们来看一下下面一段简单的例子
def add(a, b):
return a+b
add(1, "2")
这是一段很简单的整数相加返回和的代码,我们应该传入两个数字进行相加,但是我们传入了一个数字和一个字符串,我们在运行前是看不到任何错误的,当我们运行后会抛出一个异常
TypeError: unsupported operand type(s) for +: 'int' and 'str'
。当然我们这个程序很简单,一看就知道应该传声明参数,因为它只是一个简单的整数相加程序,但是如果我们写了一个复杂的函数在大型项目时,在程序运行前就知道自己是否正确的调用了函数,这样我们就需要加上类型标注。
下面时添加了类型的代码和在pycharm的显示
from typing import Union
def add(a: Union[int, float], b: Union[int, float]) -> Union[int, float]:
return a+b
add(1, "2")
此时我们在还没运行IDE就会自动帮你发现了调用错误,并且用波浪线画出。这就对调用者很友好,可读性强
2.如何使用?
细心的朋友可能发现上述改的代码我新导入了一个typing库,并且加了类型注解的代码比原本长一点
def add(a: Union[int, float], b: Union[int, float]) -> Union[int, float]:
return a+b
这段代码的意思是a和b的类型是int或者float其中一个,返回的类型是int或者float的其中一个
即使用方法为
变量名:变量类型
,这个变量类型可以是int,float,str,list,dict,set,turple
,但如果你标注的类型比较复杂,有数据结构嵌套数据结构的情况:例如列表里面有一个列表,或者说列表嵌套一个元组或者说你需要选择其中一个类型,这样我们就需要导入一个typing库(3.9版本以后可以不导入直接使用)
下面是类型注解示例:
uion:Uion[int,float]
:uion这个变量类型应为int或者float
objecct_list:List[Union[A, B, C]]
from typing import Union, List
class A:
name: str
age: int
class B:
age: int
name: str
class C:
age: int
name: str
object_list: List[Union[A, B, C]]
object_list = [A(), B(), C()]
for object in object_list:
object.name = "abc"
object.age = 20
print(object_list)
这段代码的信息量就比较大,
List[Union[A, B, C]]
的意思是我们的类型需要的是一个列表,列表里面的元素只能是A,B,C这三个类的对象
object_list: Sequence[Union[A, B, C]]
:类型为一个元组或者一个对象里面的元素为A,B,C的类型对象
list_dict: List[Dict[str, int]]
:列表里面是一个字典,字典的key:value类型为str:int
list_dict: List[Dict[str, int]]
list_dict = [{"1":1}]
3.结语
类型标注给我的感觉就是让代码可读性更强,这个优势在多人协作项目是会被方法
缺点就是代码量会更多,所以在写小脚本时不推荐使用
参考