用于类型提升的 Python 类型提示

Dar*_*n84 12 python type-annotation mypy python-typing

考虑一个执行类型提升的函数,例如两个数字的简单乘法,两个数字都可以是intfloat

def mul(a: int | float, b: int | float):  # return type?
    return a * b
Run Code Online (Sandbox Code Playgroud)

该函数返回,但和均为 的float情况除外。abint

如何正确、简洁地注释返回类型?我知道我可以这样做@overload

from typing import overload

@overload
def mul(a: int, b: int) -> int: ...

@overload
def mul(a: float, b: int | float) -> float: ...

@overload
def mul(a: int | float, b: float) -> float: ...

def mul(a, b):
    return a * b
Run Code Online (Sandbox Code Playgroud)

但这非常冗长,并且需要许多重载来处理我想象的某些“类型函数”应该处理的事情。在 C++ 中,这可以通过SFINAE来完成。在Python中,我可以用通用函数来做类似的事情吗?

def mul(a: T1, b: T2) -> promote_types(T1, T2):
    return a * b
Run Code Online (Sandbox Code Playgroud)

这也适用于 TypeVars 吗?我不期望任何内置的东西已经适用于intfloat,但也许有一些技术?

笔记:

  • 我知道建议只用 with 来注释所有内容int,但我的设置有更复杂的 TypeVars, andfloat的选择这里只是一个简单的例子。intfloat

  • 我知道我可以做到Union[int, float],但我需要具体一点。根据调用函数的确切类型,返回类型也必须是准确的,而不是联合。