代码之家  ›  专栏  ›  技术社区  ›  ttyridal

如何引用函数的类型提示

  •  1
  • ttyridal  · 技术社区  · 6 年前

    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)
    

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

    def do_something(cb: Callable[callme]):
    

    def do_something(cb: callme):
    

    但两者似乎都不成立。(python 3.6.3,mypy 0.570)

    1 回复  |  直到 6 年前
        1
  •  0
  •   Display Name    6 年前

    首先,您可以从中检索有关函数签名的结构化数据 __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]'