python类型:重载vs TypeVar

问题描述

我问自己,对于在返回与输入类型相同的函数的python中使用TypeVaroverload是否存在最佳实践。考虑这些例子。

示例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仅在返回类型不同于输入类型时才应使用?还是很好但是太冗长了?

当然,这是一个简单的例子。我正在查看的代码可能会更多地以熊猫SeriesDataFrame作为输入,而不是strint


edit:更新的示例显示intstr代码路径不同

解决方法

没有通用的“最佳实践”,但是在适用的情况下,TypeVar在任何情况下都是优越的。

  • 使用TypeVar的时间较短。每个附加类型都是一个附加参数,而过载则需要2-3行。

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

  • 使用TypeVar更有用。运行时函数会保留其批注以进行自省,而overload批注将被丢弃。

最好将overload限制在签名明显不同的情况下,即在特定变体中具有附加或受限制的参数。