如何引用函数的类型提示

How to reference the type hint of a function

在 python 的类型提示中有没有办法说 "function with the same signature as this one"?

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

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)

首先,您可以从 __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]'