如何使用另一个函数的 return 类型来注释 Python 函数?

How to annotate Python function using return type of another function?

我正在寻找 C++ 中 decltype 的一些类似物。我想要完成的是以下内容:

def f(a: int) -> List[Tuple(int, float)]
def g(a: List[int]) -> List[decltype(f)]

所以想法是使用另一个函数的类型注释。 我找到的解决方案看起来有些笨拙:

def g(a: List[int])->f.__annotations__['return']

基本上,问题是是否存在类似 decltype 的东西(也许应该称为 "return_type"),或者是否计划在进一步的版本中使用。我还编写了一个小函数来说明此功能的可能用法:

def return_type(f: Callable):
   try:
       return get_type_hints(f)['return']
   except(KeyError, AttributeError):
       return Any
def g() -> return_type(f):

UPD 正如 Jim Fasarakis-Hilliard 所建议的,我们也可以使用 get_type_hints 而不是 注释

当前 不存在,the tracker for typing 上没有问题似乎表明它已在计划中。随时欢迎您创建一个问题,看看这是如何受到欢迎的。

目前您的方法可以解决问题(即分配类型),我要介绍的唯一更改是使用 typing 中的 get_type_hints 而不是获取 __annotations__直接属性。结合 .get(因为它 return 是一个字典),也可以使它更短:

def return_type(f):
    return get_type_hints(f).get('return', Any)

def g() -> return_type(f):

如果您愿意,当然可以将其从函数中删除并在一行中使用。

如果存在向 return_type 提供随机对象的可能性,您将需要捕获它引发的 TypeError 和 return 您的默认值 Any:

def return_type(f):
    try:
        return get_type_hints(f).get('return', Any)
    except TypeError:
        return Any

当然,由于这是动态分配类型,因此您不能指望静态类型检查器能够捕捉到它,您需要对此进行静态提示。