如何引用函数的类型提示

问题描述 投票:1回答:1

有没有一种方法在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)

python python-3.x type-hinting mypy
1个回答
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]'
© www.soinside.com 2019 - 2024. All rights reserved.