You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:06:08