我好喜欢python 的类型注解呀,感觉打了一扇新世界的大门。
第一点:自动补全
本来对于python 的IDE,对于一个函数的参数是不知道它是什么类型的,因此也不知道因该如何自动补全。比如:
def f(a):
return len(a)
b = f([1, 2, 3])
很多程序现阶段是无法自动的推断出a是str,b是int类型。如果加入了类型注解:
from typing import List, Union, Optional
def f(a: Optional[List[int]]) -> int:
return len(a)
b = f([1, 2, 3])
便可以正确的进行自动补全:
第二个好处是可以进行静态代码检查,可以极大程度上帮助你减少程序中的bug。
比如在这个程序中,a被标记为Optional,这表示a是可以是None。这样的话IDE就可以提醒你:Hi,对于一个可能为None的类型,在调用len前,你需要判断它是否为None
我在编程中经常因为这个查出来自己的很多程序错误和隐藏的bug。
比如:wow, 不能将整数和字符串连接emmm. 这里只是简写。我遇到的情况是a,b两个名字很长实在是太像了,没注意就判断错None的变量了,但是没关系mypy把我救了回来。
当然还有最重要的一点是type hint可以自动生成!张翼腾:vim为python自动添加函数参数类型zhuanlan.zhihu.com
对于程序:
def f(a, b) -> int:
if a is not None:
return len(a)
if b is not None:
return len(b)
return 0
f([1, 2, 3], [4, 5, 6])
f(None, None)
输入命令:RecordParameter
便可以自动的生成type hint:
from typing import Optional, List, Union
def f(a: Optional[List[int]], b: Optional[List[int]]) -> int:
"""
called number: 2
total time: 9.5367431640625e-07s
"""
if a is not None:
return len(a)
if b is not None:
return len(b)
return 0
f([1, 2, 3], [4, 5, 6])
f(None, None)