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

问题描述 投票:0回答:1

我正在寻找 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 代替 annotations

python python-typing
1个回答
10
投票

目前不存在这样的情况,并且打字跟踪器上没有问题似乎表明这是计划中的。随时欢迎您提出问题,看看大家对此有何欢迎。

目前您的方法可以解决问题(即分配类型),我引入的唯一更改是使用

get_type_hints 中的

typing
 而不是直接获取 
__annotations__
 属性。加上 
.get
 (因为它返回一个字典),也可以使这个更短:

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

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

如果向

return_type

 提供随机对象的可能性不存在,您需要捕获它引发的 
TypeError
 并返回默认的 
Any
:

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

当然,由于这会动态分配类型,因此您不能指望静态类型检查器能够捕获它,因此您需要静态提示。

© www.soinside.com 2019 - 2024. All rights reserved.