如何引用函数的类型提示
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]'
在 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]'