许多IDE(如pycharm)会有输入类型提示和自动代码补全,就是靠类似于静态语言中的变量类型声明的做法。python语言是动态的,所以不存在需要使用重载功能,python中的重载只是为了类型提示和参数数目提示。
1. 使用overload或者typing.TypeVar(后者要求固定参数数目)
使用overload可以提示同一个名字的函数(方法)支持的不同类型和数目的形参。
使用typing.overload
from typing import Tuple
@overload
def process(response: None) -> None:
...
@overload
def process(response: int) -> Tuple[int, str]:
...
@overload
def process(response: bytes) -> str:
...
def process(response):
return 'hhe' + response
通过定义多个同名函数,上面的同名函数需要通过overload装饰器装饰。可以看到被装饰的函数的输入类型和输出类型都可以更改。但是,最后的实现方法一定要通用,也就是没有类型注解。
如下图,这样IDE就能自动提醒函数支持的输入参数的类型和数量了。
使用typing.TypeVar
对于固定数量参数的方法而言,同一个参数如果打算接受多种类型,可以这么用,比方说参数可以是:int, float, str
import typing
MyTypeT = typing.TypeVar('MyTypeT', int, str)
def foo(name: MyTypeT) -> str: # 输入参数类型提示为MyTypeT,函数返回类型提示为str
return str(name)
t = foo(3.1) # 将会提示:输入类型应该是 MyTypeT,而这里得到的却是float类型
y = foo(3) # 因为有类型提示,以后输入y.就能显示作为str类型具有的方法
2. 使用Function Annotation
def foo(name:str) -> str:
return 'hello' + name
如果输入 foo(2)则会报错,类型错误。
3. 在注释中加入类型提示
例如下面的例子中,IDE将识别出name和my_list的类型,并做自动补全提示
4. from typing import List,Tuple,Set
需要注意, 注释后面, 写 list
,List
都可以, 但不在注释后面的typeHint, 如形参及返回类型, 必须使用typing 包下相应的类.
from typing import List
def cal_sum(x:List[int]):
sum = 0
for ele in x:
sum+= ele
return sum
cal_sum()将会出现x:List[int]的提示
参考链接:https://blog.csdn.net/chuchus/article/details/77891128
5. hint vs. check
As the name says, type hints are just hints, 所以只做提示不做检查.
但 IDE 可以做检查, 避免出错.
pic 4-1 Inspections in PyCharm
6. __init__.pyi 和 pytorch中目前自动补全功能存在的bug
这个文件可以帮助我们添加type hints
,我们的IDE就是通过这种 type hints 来实现自动补全的。所以,即使pytorch的库作者团队没有给pytorch添加.pyi
来提供type hints,我们依然可以自己添加这样的文件,来帮助IDE实现自动补全的功能。