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

如何在Python中实现函数参数的类型校验与固定值约束?

如何在Python中限制函数参数为指定字符串值之一

我编写Python代码时习惯定义参数类型,比如:

def reverse_string(string_to_reverse: str) -> str:
    ...
    return reversed_string

但现在遇到一个特殊场景:函数的参数不仅要求是str类型,还必须是指定的两个字符串值之一,传入其他值时需要抛出异常提示错误。预期的代码效果如下:

>>> def some_func(test_string: str["test_string_1", "test_string_2"]) -> str:
...    return f"Valid string passed '{test_string}'"
...
>>> some_func("test_string_1") # ✔️
"Valid string passed 'test_string_1'"
>>> some_func("test_string_2") # ✔️
"Valid string passed 'test_string_2'"
>>> some_func("test_string_3") # ❌
EXCEPTION: SOME EXCEPTION MESSAGE THROWN HERE

请问是否有方法在Python中实现该需求,无论是否使用第三方库?恳请提供解决方案建议。


解决方案

一、原生Python实现

1. 函数内部显式校验

最直接的方式是在函数开头添加参数检查逻辑,不符合条件就抛出ValueError:

def some_func(test_string: str) -> str:
    allowed_values = {"test_string_1", "test_string_2"}
    if test_string not in allowed_values:
        raise ValueError(f"参数必须是{allowed_values}中的一个,传入值为{test_string}")
    return f"Valid string passed '{test_string}'"

这种方法简单直接,不需要额外依赖,适合快速实现需求。

2. 结合typing.Literal做静态提示(Python 3.8+)

如果希望类型提示更精准,同时让静态检查工具(比如mypy)提前发现错误,可以用typing.Literal定义允许的字面量类型,但注意它只做静态校验,运行时不会自动检查,所以还是要配合内部的校验逻辑:

from typing import Literal

def some_func(test_string: Literal["test_string_1", "test_string_2"]) -> str:
    allowed_values = {"test_string_1", "test_string_2"}
    if test_string not in allowed_values:
        raise ValueError(f"参数必须是{allowed_values}中的一个,传入值为{test_string}")
    return f"Valid string passed '{test_string}'"

用mypy检查代码时,传入非法值会直接提示错误,能在编码阶段提前规避问题。

二、第三方库实现

1. 使用pydantic自动校验

pydantic是热门的数据校验库,能自动处理运行时的参数校验,同时保留清晰的类型提示:

from pydantic import validate_arguments
from typing import Literal

@validate_arguments
def some_func(test_string: Literal["test_string_1", "test_string_2"]) -> str:
    return f"Valid string passed '{test_string}'"

当传入非法值时,pydantic会自动抛出ValidationError,包含详细的错误信息,无需手动写校验逻辑,适合复杂场景或大规模项目。

2. 使用attrs实现校验

如果项目中已经在用attrs管理类或参数,也可以用它的校验器功能:

import attr
from attr.validators import in_

@attr.s(auto_attribs=True)
def some_func(test_string: str = attr.ib(validator=in_(["test_string_1", "test_string_2"]))) -> str:
    return f"Valid string passed '{test_string}'"

调用时传入非法值会直接抛出ValidationError,同样能实现自动校验的效果。


内容的提问来源于stack exchange,提问作者Saif Ul Islam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:48:18