如何引用函数的类型提示

时间:2018-03-06 14:00:07

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

在python的类型提示中是否有一种方法可以说"具有与此相同的签名"?

以下工作,但需要额外的时间写出签名:

from typing import Callable

fn_sig = Callable[[int], bool]  # can I get rid of this?
def callme(a: int) -> bool:
    return a > 1

def do_something(cb: fn_sig):
    cb(1)

即我想写一些类似的东西:

def do_something(cb: Callable[callme]):

def do_something(cb: callme):

但似乎都没有效果。 (python 3.6.3,mypy 0.570)

1 个答案:

答案 0 :(得分:0)

首先,您可以从__annotations__

检索有关函数签名的结构化数据
def callme(a: int) -> bool:
    return a > 1

print(callme.__annotations__)

# prints {'a': <class 'int'>, 'return': <class 'bool'>}

从这里开始,您可以使用一个函数将其转换为您想要的类型。

更新:这是一种原始的,可能不是通用的方法:

import typing
from typing import Callable


def callme(a: int) -> bool:
    return a > 1


def get_function_type(fn):
    annotations = typing.get_type_hints(fn)
    return_type = annotations.get('return', None)
    arg_types = []
    for k, v in annotations.items():
        if k != 'return':
            arg_types.append(v)
    return Callable[arg_types, return_type]


def example(f: get_function_type(callme)):
    pass


print(get_function_type(callme))
# prints 'typing.Callable[[int], bool]'
print(get_function_type(example))
# prints 'typing.Callable[[typing.Callable[[int], bool]], NoneType]'