python 打字:重载与 TypeVar
python typing: overload vs TypeVar
我问自己是否有关于在 python 中使用 TypeVar
和 overload
对于 return 与输入类型相同的函数的最佳实践。考虑这些例子。
示例 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
应该只在 return 类型与输入类型不同时使用吗?或者它很好但过于冗长?
当然这是一个微不足道的例子。我正在查看的代码可能更多地采用 pandas Series
或 DataFrame
作为输入,而不是 str
和 int
.
编辑:更新示例以显示 int
和 str
有不同的代码路径
没有通用的“最佳实践”,但在适用的情况下 TypeVar
在任何情况下都更胜一筹。
使用 TypeVar
更短。每个额外的类型都是一个额外的参数,而重载则需要 2-3 行。
使用TypeVar
更清晰。它立即表示所有变体的工作原理基本相同,而 overload
可以有额外的参数。
使用 TypeVar
可以提供更多信息。运行时函数保留其注释以进行内省,而 overload
注释被丢弃。
倾向于将 overload
限制在签名显着不同的情况下,即在特定变体中具有额外或受限的参数。
我问自己是否有关于在 python 中使用 TypeVar
和 overload
对于 return 与输入类型相同的函数的最佳实践。考虑这些例子。
示例 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
应该只在 return 类型与输入类型不同时使用吗?或者它很好但过于冗长?
当然这是一个微不足道的例子。我正在查看的代码可能更多地采用 pandas Series
或 DataFrame
作为输入,而不是 str
和 int
.
编辑:更新示例以显示 int
和 str
没有通用的“最佳实践”,但在适用的情况下 TypeVar
在任何情况下都更胜一筹。
使用
TypeVar
更短。每个额外的类型都是一个额外的参数,而重载则需要 2-3 行。使用
TypeVar
更清晰。它立即表示所有变体的工作原理基本相同,而overload
可以有额外的参数。使用
TypeVar
可以提供更多信息。运行时函数保留其注释以进行内省,而overload
注释被丢弃。
倾向于将 overload
限制在签名显着不同的情况下,即在特定变体中具有额外或受限的参数。