如何用Pydantic验证函数调用参数但不执行目标函数?
用Pydantic校验函数参数但不执行函数的解决方案
针对新版Pydantic中validate_call替代旧版validate_arguments后,无法通过vd属性提取校验逻辑的问题,提供两种可靠方案实现参数校验且不执行原函数:
方法一:基于函数参数生成Pydantic模型(推荐)
利用create_model_from_function根据目标函数的参数定义和类型提示生成对应的Pydantic模型,通过模型实例化完成参数校验,全程不会触发原函数执行。
from pydantic import create_model_from_function, ValidationError from typing import Optional, List # 待校验的参数和目标函数 kwargs = {'x': 1, 'y': 'hi'} def foo(x: int, y: str, z: Optional[List] = None): pass # 生成仅包含参数的校验模型(include_return=False 忽略返回值类型) FooArgsModel = create_model_from_function(foo, include_return=False) try: # 验证参数是否符合要求 FooArgsModel(**kwargs) print("参数符合类型提示要求") except ValidationError as e: print(f"参数校验失败:{e}")
方法二:用空函数模拟校验逻辑
创建一个空函数,复制原函数的参数签名后用validate_call装饰,调用该装饰后的空函数即可触发参数校验,不会执行原函数代码。
from pydantic import validate_call, ValidationError from typing import Optional, List import inspect # 待校验的参数和目标函数 kwargs = {'x': 1, 'y': 'hi'} def foo(x: int, y: str, z: Optional[List] = None): pass # 定义空函数并替换签名为原函数的签名 def dummy_func(*args, **dummy_kwargs): pass dummy_func.__signature__ = inspect.signature(foo) # 装饰空函数以获得校验能力 validated_dummy = validate_call(dummy_func) try: validated_dummy(**kwargs) print("参数校验通过") except ValidationError as e: print(f"参数校验失败:{e}")
内容的提问来源于stack exchange,提问作者actual_panda
相关产品推荐
相关产品推荐

