我在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 代替注释
答案 0 :(得分:7)
目前目前并不存在,the tracker for typing上没有问题似乎表明它已经计划好了。您总是欢迎创建一个问题,看看它是如何受欢迎的。
目前,您的方法可以解决问题(即指定类型),我引入的唯一更改是使用typing
中的get_type_hints
而不是抓取__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
当然,因为这会动态分配一个类型,所以你不能期望静态类型的检查器能够捕获它,你需要静态提示。