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

时间:2017-02-08 22:23:47

标签: python python-3.x types type-hinting

我在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 代替注释

1 个答案:

答案 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

当然,因为这会动态分配一个类型,所以你不能期望静态类型的检查器能够捕获它,你需要静态提示。