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

1from functools import wraps 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

2from typing import TYPE_CHECKING, Any, Callable, Dict, List, Mapping, Optional, Tuple, Type, TypeVar, Union, overload 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

3 

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

10 

11__all__ = ('validate_arguments',) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

12 

13if TYPE_CHECKING: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

14 from pydantic.typing import AnyCallable 

15 

16 AnyCallableT = TypeVar('AnyCallableT', bound=AnyCallable) 

17 ConfigType = Union[None, Type[Any], Dict[str, Any]] 

18 

19 

20@overload 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

21def validate_arguments(func: None = None, *, config: 'ConfigType' = None) -> Callable[['AnyCallableT'], 'AnyCallableT']: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

22 ... 

23 

24 

25@overload 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

26def validate_arguments(func: 'AnyCallableT') -> 'AnyCallableT': 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

27 ... 

28 

29 

30def validate_arguments(func: Optional['AnyCallableT'] = None, *, config: 'ConfigType' = None) -> Any: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

31 """ 

32 Decorator to validate the arguments passed to a function. 

33 """ 

34 

35 def validate(_func: 'AnyCallable') -> 'AnyCallable': 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

36 vd = ValidatedFunction(_func, config) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

37 

38 @wraps(_func) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

39 def wrapper_function(*args: Any, **kwargs: Any) -> Any: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

40 return vd.call(*args, **kwargs) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

41 

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

47 

48 if func: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

49 return validate(func) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

50 else: 

51 return validate 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

52 

53 

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

58 

59 

60class ValidatedFunction: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

61 def __init__(self, function: 'AnyCallableT', config: 'ConfigType'): # noqa C901 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

62 from inspect import Parameter, signature 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

63 

64 parameters: Mapping[str, Parameter] = signature(function).parameters 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

65 

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 ) 

71 

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

77 

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

87 

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

109 

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

113 

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

117 

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

121 

122 if not takes_kwargs: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

123 # same with kwargs 

124 fields[self.v_kwargs_name] = Dict[Any, Any], None 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

125 

126 self.create_model(fields, takes_args, takes_kwargs, config) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

127 

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

131 

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

135 

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

151 

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

170 

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

178 

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

182 

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

207 

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

210 

211 class CustomConfig: 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

212 pass 1IJabcdefghijKLklmnopqrstPQRSTUNOuvwxyzABCD

213 

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

219 

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 ) 

225 

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

231 

232 raise TypeError(f'{pos_args} positional arguments expected but {pos_args + len(v)} given') 1IJabcdefghijKLklmnopqrstMEFGHNOuvwxyzABCD

233 

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

238 

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

242 

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

247 

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

251 

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

256 

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

260 

261 class Config(CustomConfig): 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

262 extra = getattr(CustomConfig, 'extra', Extra.forbid) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD

263 

264 self.model = create_model(to_camel(self.raw_function.__name__), __base__=DecoratorBaseModel, **fields) 1IJabcdefghijKLklmnopqrstMEFGPQRSTUHNOuvwxyzABCD