我想知道如下所示输入注释 python 函数的正确方法是什么?
def f(value):
if isinstance(value, str):
return None
return value
这是一个玩具示例,类似于我遇到的需要类型注释的 python。使用
Union
像
def f(value: Union[float, int, str]) -> Union[float, int, None]:
if isinstance(value, str):
return None
return value
感觉不对,因为它不执行规则
int
输入必须产生 int
输出。float
输入必须产生 float
输出。str
输入必须产生 None
。假设输入只能是
int/float/str
之一。
typing.overload
根据参数类型缩小返回值的类型:
from typing import overload
@overload
def f(value: str) -> None: ...
@overload
def f(value: int) -> int: ...
@overload
def f(value: float) -> float: ...
def f(value: int|float|str) -> int|float|None:
if isinstance(value, str):
return None
return value
请注意,实际实现使用所有可能的参数和返回类型的联合。
如果对函数的调用符合重载存根之一,则会推断出适当的返回类型:
reveal_type(f("foo")) # revealed type is "None"
reveal_type(f(123)) # revealed type is "builtins.int"