python 打字:重载与 TypeVar

python typing: overload vs TypeVar

我问自己是否有关于在 python 中使用 TypeVaroverload 对于 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 SeriesDataFrame 作为输入,而不是 strint.


编辑:更新示例以显示 intstr

有不同的代码路径

没有通用的“最佳实践”,但在适用的情况下 TypeVar 在任何情况下都更胜一筹。

  • 使用 TypeVar 更短。每个额外的类型都是一个额外的参数,而重载则需要 2-3 行。

  • 使用TypeVar更清晰。它立即表示所有变体的工作原理基本相同,而 overload 可以有额外的参数。

  • 使用 TypeVar 可以提供更多信息。运行时函数保留其注释以进行内省,而 overload 注释被丢弃。

倾向于将 overload 限制在签名显着不同的情况下,即在特定变体中具有额外或受限的参数。