Feature: 支持子依赖定义 Pydantic 类型校验 (#2310)

This commit is contained in:
Ju4tCode
2023-08-29 18:45:12 +08:00
committed by GitHub
parent 79f833b946
commit f59271bd47
6 changed files with 244 additions and 25 deletions

View File

@ -45,6 +45,10 @@ class Param(abc.ABC, FieldInfo):
继承自 `pydantic.fields.FieldInfo`,用于描述参数信息(不包括参数名)。
"""
def __init__(self, *args, validate: bool = False, **kwargs: Any) -> None:
super().__init__(*args, **kwargs)
self.validate = validate
@classmethod
def _check_param(
cls, param: inspect.Parameter, allow_types: Tuple[Type["Param"], ...]
@ -206,10 +210,12 @@ class Dependent(Generic[R]):
raise
async def _solve_field(self, field: ModelField, params: Dict[str, Any]) -> Any:
value = await cast(Param, field.field_info)._solve(**params)
param = cast(Param, field.field_info)
value = await param._solve(**params)
if value is Undefined:
value = field.get_default()
return check_field_type(field, value)
v = check_field_type(field, value)
return v if param.validate else value
async def solve(self, **params: Any) -> Dict[str, Any]:
# solve parameterless

View File

@ -5,7 +5,7 @@ FrontMatter:
"""
import inspect
from typing import Any, Dict, TypeVar, Callable, ForwardRef
from typing import Any, Dict, Callable, ForwardRef
from loguru import logger
from pydantic.fields import ModelField
@ -13,8 +13,6 @@ from pydantic.typing import evaluate_forwardref
from nonebot.exception import TypeMisMatch
V = TypeVar("V")
def get_typed_signature(call: Callable[..., Any]) -> inspect.Signature:
"""获取可调用对象签名"""
@ -49,10 +47,10 @@ def get_typed_annotation(param: inspect.Parameter, globalns: Dict[str, Any]) ->
return annotation
def check_field_type(field: ModelField, value: V) -> V:
def check_field_type(field: ModelField, value: Any) -> Any:
"""检查字段类型是否匹配"""
_, errs_ = field.validate(value, {}, loc=())
v, errs_ = field.validate(value, {}, loc=())
if errs_:
raise TypeMisMatch(field, value)
return value
return v