我正在寻找 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
目前不存在这样的情况,并且打字跟踪器上没有问题似乎表明这是计划中的。随时欢迎您提出问题,看看大家对此有何欢迎。
目前您的方法可以解决问题(即分配类型),我引入的唯一更改是使用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
当然,由于这会动态分配类型,因此您不能指望静态类型检查器能够捕获它,因此您需要静态提示。