Python如何给入参添加限定为指定预设函数的type hint?
实现方案
方案1:使用枚举类封装预设函数(推荐,静态+运行时双重校验)
这种方案不仅能满足静态类型检查的要求,还能在运行时严格限制传入的可选值,避免非法函数传入:
from enum import Enum from typing import Callable def func1(a:int, b:int) -> int: return a + b def func2(a:int, b:int) -> int: return a - b def func3(a:int, b:int) -> int: return a * b # 定义枚举类封装所有允许的函数 class CalculationFunc(Enum): FUNC1 = func1 FUNC2 = func2 FUNC3 = func3 class Calculator: def __init__(self, calculation_function: CalculationFunc = CalculationFunc.FUNC1): # 直接从枚举成员中取出实际函数使用 self.calc_func = calculation_function.value def calc(self, a: int, b: int) -> int: return self.calc_func(a, b) # 使用示例 calc = Calculator(CalculationFunc.FUNC2) print(calc.calc(3, 1)) # 输出2
这种方式下类型检查器会直接限制你只能传入CalculationFunc的三个枚举成员,完全符合你的要求。
方案2:使用Literal直接限制函数(仅静态类型校验)
如果你不需要运行时校验,只需要静态类型检查生效,可以使用typing.Literal,注意该特性需要Python 3.10+,且mypy等类型检查器版本在0.981以上才支持函数作为Literal的有效值:
from typing import Literal, Callable, Optional def func1(a:int, b:int) -> int: pass def func2(a:int, b:int) -> int: pass def func3(a:int, b:int) -> int: pass class Calculator: def __init__(self, calculation_function: Optional[Literal[func1, func2, func3]] = None): # 如需运行时校验可添加以下判断 if calculation_function is not None and calculation_function not in (func1, func2, func3): raise ValueError("仅允许传入func1、func2、func3") self.calc_func = calculation_function or func1
补充:预设函数改为类方法的实现
如果你选择把预设函数改成类的方法,也可以直接用Literal限定可选范围:
from typing import Literal, Optional class CalculationFuncs: @staticmethod def func1(a:int, b:int) -> int: return a + b @staticmethod def func2(a:int, b:int) -> int: return a - b @staticmethod def func3(a:int, b:int) -> int: return a * b class Calculator: def __init__(self, calculation_function: Optional[Literal[CalculationFuncs.func1, CalculationFuncs.func2, CalculationFuncs.func3]] = None): self.calc_func = calculation_function or CalculationFuncs.func1
内容的提问来源于stack exchange,提问作者Slavka
相关产品推荐
相关产品推荐

