我问自己,对于在返回与输入类型相同的函数的python中使用TypeVar
和overload
是否存在最佳实践。考虑这些例子。
示例1.使用TypeVar
:
from typing import TypeVar
StrOrInt = TypeVar("StrOrInt", str, int)
def return_same_type_typevar(x: StrOrInt) -> StrOrInt:
if isinstance(x, str):
# process str
return x
else:
# process int
return x
示例2,使用overload
:
from typing import overload
@overload
def return_same_type_overload(x: str) -> str:
...
@overload
def return_same_type_overload(x: int) -> int:
...
def return_same_type_overload(x):
if isinstance(x, str):
# process str
return x
else:
# process int
return x
两个示例实际上达到了相同的效果吗?这里是否不overload
的这种用法,overload
仅在返回类型不同于输入类型时才应使用?还是很好但是太冗长了?
当然,这是一个简单的例子。我正在查看的代码可能会更多地以熊猫Series
或DataFrame
作为输入,而不是str
和int
。
edit:更新的示例显示int
和str
的代码路径不同
答案 0 :(得分:2)
没有通用的“最佳实践”,但是在适用的情况下,TypeVar
在任何情况下都是优越的。
使用TypeVar
的时间较短。每个附加类型都是一个附加参数,而过载则需要2-3行。
使用TypeVar
更清晰。它立即表示,所有变体的工作原理基本相同,而overload
可以具有其他参数。
使用TypeVar
更有用。运行时函数会保留其批注以进行自省,而overload
批注将被丢弃。
最好将overload
限制在签名明显不同的情况下,即在特定变体中具有附加或受限制的参数。