如何简化Python柯里化函数的返回类型标注以避免重复?
Python函数返回类型标注简化方案
先看这段类型标注正确的Python代码:
def make_repeater(times: int) -> Callable[[str, str], str]: def repeat(s: str, s2: str) -> str: return (s + s2) * times return repeat
问题是:有没有办法简化外部函数的返回类型标注,不用重复指定内部函数repeat的参数和返回值类型?
先分析两种不太理想的方案:
- 直接用
Callable作为返回类型:写法虽然简单,但调用make_repeater返回的函数时,类型标注信息会丢失,类型检查工具无法识别参数和返回值的具体类型。
def make_repeater(times: int) -> Callable: def repeat(s: str, s2: str) -> str: return (s + s2) * times return repeat
- 忽略返回类型标注:用
# type: ignore[no-untyped-def]跳过类型检查,虽然mypy能自动推断内部函数的类型,但这种写法相当于放弃了对外部函数返回类型的显式约束,不够严谨。
def make_repeater(times: int): # type: ignore[no-untyped-def] def repeat(s: str, s2: str) -> str: return (s + s2) * times return repeat
更优的简化方案
可以通过定义类型别名来复用内部函数的类型信息,避免重复标注:
from typing import Callable # 先定义内部函数的类型别名 RepeatFunc = Callable[[str, str], str] def make_repeater(times: int) -> RepeatFunc: def repeat(s: str, s2: str) -> str: return (s + s2) * times return repeat
这种方案的好处是:
- 类型信息完整保留,类型检查工具能正常识别返回函数的参数和返回值类型
- 当内部函数的类型需要调整时,只需要修改一次类型别名即可,维护更方便
如果使用Python 3.10及以上版本,还可以用typing.ParamSpec和ReturnType来实现更通用的类型复用(适合内部函数类型不确定的场景):
from typing import Callable, ParamSpec, ReturnType P = ParamSpec("P") R = ReturnType("R") def make_repeater(times: int) -> Callable[P, R]: def repeat(s: str, s2: str) -> str: return (s + s2) * times return repeat # type: ignore[return-value]
不过对于这个具体场景,类型别名的写法更直观简洁。
内容的提问来源于stack exchange,提问作者Alex Li
相关产品推荐
相关产品推荐

