Python中作为函数参数传入的函数应使用什么类型标注?
函数类型参数的正确标注方式
直接写func: function会报NameError,是因为Python命名空间中没有暴露可直接用于类型标注的function名称。标注函数/可调用对象类型的标准方案是使用Callable类型。
基础用法
Callable的标注格式为Callable[[参数1类型, 参数2类型, ...], 返回值类型],不同Python版本的导入路径有区别:
- Python 3.9及以上版本:从
collections.abc模块导入,针对示例中无入参、返回字符串的函数参数,写法如下:
from collections.abc import Callable def my_func_2(func: Callable[[], str]) -> str: return func()
- Python 3.8及更早版本:从
typing模块导入,标注语法完全一致:
from typing import Callable def my_func_2(func: Callable[[], str]) -> str: return func()
扩展规则
- 如果被传入的函数有明确入参,按顺序把参数类型写到方括号的列表位置即可。例如被传入的函数接收两个int参数、返回int结果,标注为
Callable[[int, int], int],对应使用示例:
from collections.abc import Callable def add(a: int, b: int) -> int: return a + b def run_calc(calc_func: Callable[[int, int], int], x: int, y: int) -> int: return calc_func(x, y)
- 如果不需要约束被传入函数的参数列表,仅约束返回值类型,可以用省略号代替参数列表:
Callable[..., str]代表任意入参、返回值为str的可调用对象 - 不要用
types.FunctionType做这类标注:这个类型仅能匹配普通用户自定义函数,无法覆盖内置函数、实现了__call__方法的类实例、functools.partial对象等其他合法可调用对象,适用范围极窄,不符合绝大多数场景的需求。
内容的提问来源于stack exchange,提问作者Alberto Aliberti
相关产品推荐
相关产品推荐

