有没有办法在 Python 中指定条件类型提示?
Is there a way to specify a conditional type hint in Python?
假设如下代码:
from typing import Union
def invert(value: Union[str, int]) -> Union[int, str]:
if isinstance(value, str):
return int(value)
elif isinstance(value, int):
return str(value)
else:
raise ValueError("value must be 'int' or 'str'")
很容易看出 str
输入导致 int
输出,反之亦然。有没有办法指定 return 类型,以便它编码这种反向关系?
目前在 Python 中没有真正自然的方法来指定条件类型提示。
也就是说,在您的特定情况下,您可以使用 @overload
来表达您要执行的操作:
from typing import overload, Union
# Body of overloads must be empty
@overload
def invert(value: str) -> int: ...
@overload
def invert(value: int) -> str: ...
# Implementation goes last, without an overload.
# Adding type hints here are optional -- if they
# exist, the function body is checked against the
# provided hints.
def invert(value: Union[int, str]) -> Union[int, str]:
if isinstance(value, str):
return int(value)
elif isinstance(value, int):
return str(value)
else:
raise ValueError("value must be 'int' or 'str'")
假设如下代码:
from typing import Union
def invert(value: Union[str, int]) -> Union[int, str]:
if isinstance(value, str):
return int(value)
elif isinstance(value, int):
return str(value)
else:
raise ValueError("value must be 'int' or 'str'")
很容易看出 str
输入导致 int
输出,反之亦然。有没有办法指定 return 类型,以便它编码这种反向关系?
目前在 Python 中没有真正自然的方法来指定条件类型提示。
也就是说,在您的特定情况下,您可以使用 @overload
来表达您要执行的操作:
from typing import overload, Union
# Body of overloads must be empty
@overload
def invert(value: str) -> int: ...
@overload
def invert(value: int) -> str: ...
# Implementation goes last, without an overload.
# Adding type hints here are optional -- if they
# exist, the function body is checked against the
# provided hints.
def invert(value: Union[int, str]) -> Union[int, str]:
if isinstance(value, str):
return int(value)
elif isinstance(value, int):
return str(value)
else:
raise ValueError("value must be 'int' or 'str'")