Coverage for pydantic/decorator.py: 100.00%
179 statements
« prev ^ index » next coverage.py v7.6.1, created at 2024-08-15 13:26 +0000
« prev ^ index » next coverage.py v7.6.1, created at 2024-08-15 13:26 +0000
1from functools import wraps 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
2from typing import TYPE_CHECKING, Any, Callable, Dict, List, Mapping, Optional, Tuple, Type, TypeVar, Union, overload 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
4from pydantic import validator 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
5from pydantic.config import Extra 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
6from pydantic.errors import ConfigError 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
7from pydantic.main import BaseModel, create_model 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
8from pydantic.typing import get_all_type_hints 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
9from pydantic.utils import to_camel 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
11__all__ = ('validate_arguments',) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
13if TYPE_CHECKING: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
14 from pydantic.typing import AnyCallable
16 AnyCallableT = TypeVar('AnyCallableT', bound=AnyCallable)
17 ConfigType = Union[None, Type[Any], Dict[str, Any]]
20@overload 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
21def validate_arguments(func: None = None, *, config: 'ConfigType' = None) -> Callable[['AnyCallableT'], 'AnyCallableT']: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
22 ...
25@overload 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
26def validate_arguments(func: 'AnyCallableT') -> 'AnyCallableT': 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
27 ...
30def validate_arguments(func: Optional['AnyCallableT'] = None, *, config: 'ConfigType' = None) -> Any: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
31 """
32 Decorator to validate the arguments passed to a function.
33 """
35 def validate(_func: 'AnyCallable') -> 'AnyCallable': 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
36 vd = ValidatedFunction(_func, config) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
38 @wraps(_func) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
39 def wrapper_function(*args: Any, **kwargs: Any) -> Any: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
40 return vd.call(*args, **kwargs) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
42 wrapper_function.vd = vd # type: ignore 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
43 wrapper_function.validate = vd.init_model_instance # type: ignore 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
44 wrapper_function.raw_function = vd.raw_function # type: ignore 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
45 wrapper_function.model = vd.model # type: ignore 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
46 return wrapper_function 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
48 if func: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
49 return validate(func) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
50 else:
51 return validate 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
54ALT_V_ARGS = 'v__args' 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
55ALT_V_KWARGS = 'v__kwargs' 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
56V_POSITIONAL_ONLY_NAME = 'v__positional_only' 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
57V_DUPLICATE_KWARGS = 'v__duplicate_kwargs' 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
60class ValidatedFunction: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
61 def __init__(self, function: 'AnyCallableT', config: 'ConfigType'): # noqa C901 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
62 from inspect import Parameter, signature 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
64 parameters: Mapping[str, Parameter] = signature(function).parameters 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
66 if parameters.keys() & {ALT_V_ARGS, ALT_V_KWARGS, V_POSITIONAL_ONLY_NAME, V_DUPLICATE_KWARGS}: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
67 raise ConfigError( 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
68 f'"{ALT_V_ARGS}", "{ALT_V_KWARGS}", "{V_POSITIONAL_ONLY_NAME}" and "{V_DUPLICATE_KWARGS}" '
69 f'are not permitted as argument names when using the "{validate_arguments.__name__}" decorator'
70 )
72 self.raw_function = function 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
73 self.arg_mapping: Dict[int, str] = {} 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
74 self.positional_only_args = set() 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
75 self.v_args_name = 'args' 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
76 self.v_kwargs_name = 'kwargs' 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
78 type_hints = get_all_type_hints(function) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
79 takes_args = False 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
80 takes_kwargs = False 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
81 fields: Dict[str, Tuple[Any, Any]] = {} 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
82 for i, (name, p) in enumerate(parameters.items()): 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
83 if p.annotation is p.empty: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
84 annotation = Any 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
85 else:
86 annotation = type_hints[name] 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
88 default = ... if p.default is p.empty else p.default 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
89 if p.kind == Parameter.POSITIONAL_ONLY: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
90 self.arg_mapping[i] = name 1abcdefghijklmnopqrstEFGHuvwxyzABCD
91 fields[name] = annotation, default 1abcdefghijklmnopqrstEFGHuvwxyzABCD
92 fields[V_POSITIONAL_ONLY_NAME] = List[str], None 1abcdefghijklmnopqrstEFGHuvwxyzABCD
93 self.positional_only_args.add(name) 1abcdefghijklmnopqrstEFGHuvwxyzABCD
94 elif p.kind == Parameter.POSITIONAL_OR_KEYWORD: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
95 self.arg_mapping[i] = name 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
96 fields[name] = annotation, default 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
97 fields[V_DUPLICATE_KWARGS] = List[str], None 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
98 elif p.kind == Parameter.KEYWORD_ONLY: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
99 fields[name] = annotation, default 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
100 elif p.kind == Parameter.VAR_POSITIONAL: 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
101 self.v_args_name = name 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
102 fields[name] = Tuple[annotation, ...], None 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
103 takes_args = True 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
104 else:
105 assert p.kind == Parameter.VAR_KEYWORD, p.kind 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
106 self.v_kwargs_name = name 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
107 fields[name] = Dict[str, annotation], None # type: ignore 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
108 takes_kwargs = True 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
110 # these checks avoid a clash between "args" and a field with that name
111 if not takes_args and self.v_args_name in fields: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
112 self.v_args_name = ALT_V_ARGS 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
114 # same with "kwargs"
115 if not takes_kwargs and self.v_kwargs_name in fields: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
116 self.v_kwargs_name = ALT_V_KWARGS 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
118 if not takes_args: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
119 # we add the field so validation below can raise the correct exception
120 fields[self.v_args_name] = List[Any], None 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
122 if not takes_kwargs: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
123 # same with kwargs
124 fields[self.v_kwargs_name] = Dict[Any, Any], None 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
126 self.create_model(fields, takes_args, takes_kwargs, config) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
128 def init_model_instance(self, *args: Any, **kwargs: Any) -> BaseModel: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
129 values = self.build_values(args, kwargs) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
130 return self.model(**values) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
132 def call(self, *args: Any, **kwargs: Any) -> Any: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
133 m = self.init_model_instance(*args, **kwargs) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
134 return self.execute(m) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
136 def build_values(self, args: Tuple[Any, ...], kwargs: Dict[str, Any]) -> Dict[str, Any]: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
137 values: Dict[str, Any] = {} 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
138 if args: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
139 arg_iter = enumerate(args) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
140 while True:
141 try: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
142 i, a = next(arg_iter) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
143 except StopIteration: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
144 break 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
145 arg_name = self.arg_mapping.get(i) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
146 if arg_name is not None: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
147 values[arg_name] = a 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
148 else:
149 values[self.v_args_name] = [a] + [a for _, a in arg_iter] 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
150 break 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
152 var_kwargs: Dict[str, Any] = {} 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
153 wrong_positional_args = [] 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
154 duplicate_kwargs = [] 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
155 fields_alias = [ 1abcdefghijklmnopqrstMEFGPQRSTUHuvwxyzABCD
156 field.alias
157 for name, field in self.model.__fields__.items()
158 if name not in (self.v_args_name, self.v_kwargs_name)
159 ]
160 non_var_fields = set(self.model.__fields__) - {self.v_args_name, self.v_kwargs_name} 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
161 for k, v in kwargs.items(): 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
162 if k in non_var_fields or k in fields_alias: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
163 if k in self.positional_only_args: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
164 wrong_positional_args.append(k) 1abcdefghijklmnopqrstEFGHuvwxyzABCD
165 if k in values: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
166 duplicate_kwargs.append(k) 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
167 values[k] = v 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
168 else:
169 var_kwargs[k] = v 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
171 if var_kwargs: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
172 values[self.v_kwargs_name] = var_kwargs 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
173 if wrong_positional_args: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
174 values[V_POSITIONAL_ONLY_NAME] = wrong_positional_args 1abcdefghijklmnopqrstEFGHuvwxyzABCD
175 if duplicate_kwargs: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
176 values[V_DUPLICATE_KWARGS] = duplicate_kwargs 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
177 return values 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
179 def execute(self, m: BaseModel) -> Any: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
180 d = {k: v for k, v in m._iter() if k in m.__fields_set__ or m.__fields__[k].default_factory} 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
181 var_kwargs = d.pop(self.v_kwargs_name, {}) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
183 if self.v_args_name in d: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
184 args_: List[Any] = [] 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
185 in_kwargs = False 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
186 kwargs = {} 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
187 for name, value in d.items(): 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
188 if in_kwargs: 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
189 kwargs[name] = value 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
190 elif name == self.v_args_name: 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
191 args_ += value 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
192 in_kwargs = True 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
193 else:
194 args_.append(value) 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
195 return self.raw_function(*args_, **kwargs, **var_kwargs) 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
196 elif self.positional_only_args: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
197 args_ = [] 1abcdefghijklmnopqrstEFGHuvwxyzABCD
198 kwargs = {} 1abcdefghijklmnopqrstEFGHuvwxyzABCD
199 for name, value in d.items(): 1abcdefghijklmnopqrstEFGHuvwxyzABCD
200 if name in self.positional_only_args: 1abcdefghijklmnopqrstEFGHuvwxyzABCD
201 args_.append(value) 1abcdefghijklmnopqrstEFGHuvwxyzABCD
202 else:
203 kwargs[name] = value 1abcdefghijklmnopqrstEFGHuvwxyzABCD
204 return self.raw_function(*args_, **kwargs, **var_kwargs) 1abcdefghijklmnopqrstEFGHuvwxyzABCD
205 else:
206 return self.raw_function(**d, **var_kwargs) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
208 def create_model(self, fields: Dict[str, Any], takes_args: bool, takes_kwargs: bool, config: 'ConfigType') -> None: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
209 pos_args = len(self.arg_mapping) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
211 class CustomConfig: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
212 pass 1IJabcdefghijKLklmnopqrstPQRSTUNOuvwxyzABCD
214 if not TYPE_CHECKING: # pragma: no branch 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
215 if isinstance(config, dict): 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
216 CustomConfig = type('Config', (), config) # noqa: F811 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
217 elif config is not None: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
218 CustomConfig = config # noqa: F811 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
220 if hasattr(CustomConfig, 'fields') or hasattr(CustomConfig, 'alias_generator'): 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
221 raise ConfigError( 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
222 'Setting the "fields" and "alias_generator" property on custom Config for '
223 '@validate_arguments is not yet supported, please remove.'
224 )
226 class DecoratorBaseModel(BaseModel): 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
227 @validator(self.v_args_name, check_fields=False, allow_reuse=True) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
228 def check_args(cls, v: Optional[List[Any]]) -> Optional[List[Any]]: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
229 if takes_args or v is None: 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
230 return v 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
232 raise TypeError(f'{pos_args} positional arguments expected but {pos_args + len(v)} given') 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
234 @validator(self.v_kwargs_name, check_fields=False, allow_reuse=True) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
235 def check_kwargs(cls, v: Optional[Dict[str, Any]]) -> Optional[Dict[str, Any]]: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
236 if takes_kwargs or v is None: 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
237 return v 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
239 plural = '' if len(v) == 1 else 's' 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
240 keys = ', '.join(map(repr, v.keys())) 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
241 raise TypeError(f'unexpected keyword argument{plural}: {keys}') 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
243 @validator(V_POSITIONAL_ONLY_NAME, check_fields=False, allow_reuse=True) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
244 def check_positional_only(cls, v: Optional[List[str]]) -> None: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
245 if v is None: 1abcdefghijklmnopqrstEFGHuvwxyzABCD
246 return 1abcdefghijklmnopqrstEFGHuvwxyzABCD
248 plural = '' if len(v) == 1 else 's' 1abcdefghijklmnopqrstEFGHuvwxyzABCD
249 keys = ', '.join(map(repr, v)) 1abcdefghijklmnopqrstEFGHuvwxyzABCD
250 raise TypeError(f'positional-only argument{plural} passed as keyword argument{plural}: {keys}') 1abcdefghijklmnopqrstEFGHuvwxyzABCD
252 @validator(V_DUPLICATE_KWARGS, check_fields=False, allow_reuse=True) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
253 def check_duplicate_kwargs(cls, v: Optional[List[str]]) -> None: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
254 if v is None: 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
255 return 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
257 plural = '' if len(v) == 1 else 's' 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
258 keys = ', '.join(map(repr, v)) 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
259 raise TypeError(f'multiple values for argument{plural}: {keys}') 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD
261 class Config(CustomConfig): 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
262 extra = getattr(CustomConfig, 'extra', Extra.forbid) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD
264 self.model = create_model(to_camel(self.raw_function.__name__), __base__=DecoratorBaseModel, **fields) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD