Coverage for pydantic/fields.py: 99.04%

458 statements  

« prev     ^ index     » next       coverage.py v7.8.1, created at 2025-05-22 20:36 +0000

1"""Defining fields on models.""" 

2 

3from __future__ import annotations as _annotations 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

4 

5import dataclasses 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

6import inspect 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

7import sys 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

8import typing 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

9from collections.abc import Mapping 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

10from copy import copy 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

11from dataclasses import Field as DataclassField 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

12from functools import cached_property 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

13from typing import Annotated, Any, Callable, ClassVar, Literal, TypeVar, cast, overload 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

14from warnings import warn 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

15 

16import annotated_types 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

17import typing_extensions 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

18from pydantic_core import PydanticUndefined 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

19from typing_extensions import Self, TypeAlias, Unpack, deprecated 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

20from typing_inspection import typing_objects 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

21from typing_inspection.introspection import UNKNOWN, AnnotationSource, ForbiddenQualifier, Qualifier, inspect_annotation 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

22 

23from . import types 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

24from ._internal import _decorators, _fields, _generics, _internal_dataclass, _repr, _typing_extra, _utils 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

25from ._internal._namespace_utils import GlobalsNamespace, MappingNamespace 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

26from .aliases import AliasChoices, AliasPath 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

27from .config import JsonDict 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

28from .errors import PydanticForbiddenQualifier, PydanticUserError 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

29from .json_schema import PydanticJsonSchemaWarning 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

30from .warnings import PydanticDeprecatedSince20 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

31 

32if typing.TYPE_CHECKING: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

33 from ._internal._repr import ReprArgs 1p

34else: 

35 # See PyCharm issues https://youtrack.jetbrains.com/issue/PY-21915 

36 # and https://youtrack.jetbrains.com/issue/PY-51428 

37 DeprecationWarning = PydanticDeprecatedSince20 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

38 

39__all__ = 'Field', 'PrivateAttr', 'computed_field' 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

40 

41 

42_Unset: Any = PydanticUndefined 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

43 

44if sys.version_info >= (3, 13): 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

45 import warnings 1abcdefJghi

46 

47 Deprecated: TypeAlias = warnings.deprecated | deprecated 1abcdefJghi

48else: 

49 Deprecated: TypeAlias = deprecated 1xyzArsjkqpBCDEtulmNOPKLMFGHIvwno

50 

51 

52class _FromFieldInfoInputs(typing_extensions.TypedDict, total=False): 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

53 """This class exists solely to add type checking for the `**kwargs` in `FieldInfo.from_field`.""" 

54 

55 # TODO PEP 747: use TypeForm: 

56 annotation: type[Any] | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

57 default_factory: Callable[[], Any] | Callable[[dict[str, Any]], Any] | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

58 alias: str | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

59 alias_priority: int | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

60 validation_alias: str | AliasPath | AliasChoices | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

61 serialization_alias: str | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

62 title: str | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

63 field_title_generator: Callable[[str, FieldInfo], str] | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

64 description: str | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

65 examples: list[Any] | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

66 exclude: bool | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

67 gt: annotated_types.SupportsGt | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

68 ge: annotated_types.SupportsGe | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

69 lt: annotated_types.SupportsLt | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

70 le: annotated_types.SupportsLe | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

71 multiple_of: float | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

72 strict: bool | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

73 min_length: int | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

74 max_length: int | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

75 pattern: str | typing.Pattern[str] | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

76 allow_inf_nan: bool | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

77 max_digits: int | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

78 decimal_places: int | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

79 union_mode: Literal['smart', 'left_to_right'] | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

80 discriminator: str | types.Discriminator | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

81 deprecated: Deprecated | str | bool | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

82 json_schema_extra: JsonDict | Callable[[JsonDict], None] | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

83 frozen: bool | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

84 validate_default: bool | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

85 repr: bool 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

86 init: bool | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

87 init_var: bool | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

88 kw_only: bool | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

89 coerce_numbers_to_str: bool | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

90 fail_fast: bool | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

91 

92 

93class _FieldInfoInputs(_FromFieldInfoInputs, total=False): 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

94 """This class exists solely to add type checking for the `**kwargs` in `FieldInfo.__init__`.""" 

95 

96 default: Any 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

97 

98 

99class FieldInfo(_repr.Representation): 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

100 """This class holds information about a field. 

101 

102 `FieldInfo` is used for any field definition regardless of whether the [`Field()`][pydantic.fields.Field] 

103 function is explicitly used. 

104 

105 !!! warning 

106 You generally shouldn't be creating `FieldInfo` directly, you'll only need to use it when accessing 

107 [`BaseModel`][pydantic.main.BaseModel] `.model_fields` internals. 

108 

109 Attributes: 

110 annotation: The type annotation of the field. 

111 default: The default value of the field. 

112 default_factory: A callable to generate the default value. The callable can either take 0 arguments 

113 (in which case it is called as is) or a single argument containing the already validated data. 

114 alias: The alias name of the field. 

115 alias_priority: The priority of the field's alias. 

116 validation_alias: The validation alias of the field. 

117 serialization_alias: The serialization alias of the field. 

118 title: The title of the field. 

119 field_title_generator: A callable that takes a field name and returns title for it. 

120 description: The description of the field. 

121 examples: List of examples of the field. 

122 exclude: Whether to exclude the field from the model serialization. 

123 discriminator: Field name or Discriminator for discriminating the type in a tagged union. 

124 deprecated: A deprecation message, an instance of `warnings.deprecated` or the `typing_extensions.deprecated` backport, 

125 or a boolean. If `True`, a default deprecation message will be emitted when accessing the field. 

126 json_schema_extra: A dict or callable to provide extra JSON schema properties. 

127 frozen: Whether the field is frozen. 

128 validate_default: Whether to validate the default value of the field. 

129 repr: Whether to include the field in representation of the model. 

130 init: Whether the field should be included in the constructor of the dataclass. 

131 init_var: Whether the field should _only_ be included in the constructor of the dataclass, and not stored. 

132 kw_only: Whether the field should be a keyword-only argument in the constructor of the dataclass. 

133 metadata: List of metadata constraints. 

134 """ 

135 

136 annotation: type[Any] | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

137 default: Any 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

138 default_factory: Callable[[], Any] | Callable[[dict[str, Any]], Any] | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

139 alias: str | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

140 alias_priority: int | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

141 validation_alias: str | AliasPath | AliasChoices | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

142 serialization_alias: str | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

143 title: str | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

144 field_title_generator: Callable[[str, FieldInfo], str] | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

145 description: str | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

146 examples: list[Any] | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

147 exclude: bool | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

148 discriminator: str | types.Discriminator | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

149 deprecated: Deprecated | str | bool | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

150 json_schema_extra: JsonDict | Callable[[JsonDict], None] | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

151 frozen: bool | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

152 validate_default: bool | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

153 repr: bool 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

154 init: bool | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

155 init_var: bool | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

156 kw_only: bool | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

157 metadata: list[Any] 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

158 

159 __slots__ = ( 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

160 'annotation', 

161 'default', 

162 'default_factory', 

163 'alias', 

164 'alias_priority', 

165 'validation_alias', 

166 'serialization_alias', 

167 'title', 

168 'field_title_generator', 

169 'description', 

170 'examples', 

171 'exclude', 

172 'discriminator', 

173 'deprecated', 

174 'json_schema_extra', 

175 'frozen', 

176 'validate_default', 

177 'repr', 

178 'init', 

179 'init_var', 

180 'kw_only', 

181 'metadata', 

182 '_attributes_set', 

183 '_qualifiers', 

184 '_complete', 

185 '_original_assignment', 

186 '_original_annotation', 

187 ) 

188 

189 # used to convert kwargs to metadata/constraints, 

190 # None has a special meaning - these items are collected into a `PydanticGeneralMetadata` 

191 metadata_lookup: ClassVar[dict[str, typing.Callable[[Any], Any] | None]] = { 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

192 'strict': types.Strict, 

193 'gt': annotated_types.Gt, 

194 'ge': annotated_types.Ge, 

195 'lt': annotated_types.Lt, 

196 'le': annotated_types.Le, 

197 'multiple_of': annotated_types.MultipleOf, 

198 'min_length': annotated_types.MinLen, 

199 'max_length': annotated_types.MaxLen, 

200 'pattern': None, 

201 'allow_inf_nan': None, 

202 'max_digits': None, 

203 'decimal_places': None, 

204 'union_mode': None, 

205 'coerce_numbers_to_str': None, 

206 'fail_fast': types.FailFast, 

207 } 

208 

209 def __init__(self, **kwargs: Unpack[_FieldInfoInputs]) -> None: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

210 """This class should generally not be initialized directly; instead, use the `pydantic.fields.Field` function 

211 or one of the constructor classmethods. 

212 

213 See the signature of `pydantic.fields.Field` for more details about the expected arguments. 

214 """ 

215 self._attributes_set = {k: v for k, v in kwargs.items() if v is not _Unset} 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

216 kwargs = {k: _DefaultValues.get(k) if v is _Unset else v for k, v in kwargs.items()} # type: ignore 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

217 self.annotation = kwargs.get('annotation') 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

218 

219 default = kwargs.pop('default', PydanticUndefined) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

220 if default is Ellipsis: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

221 self.default = PydanticUndefined 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

222 self._attributes_set.pop('default', None) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

223 else: 

224 self.default = default 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

225 

226 self.default_factory = kwargs.pop('default_factory', None) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

227 

228 if self.default is not PydanticUndefined and self.default_factory is not None: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

229 raise TypeError('cannot specify both default and default_factory') 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

230 

231 self.alias = kwargs.pop('alias', None) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

232 self.validation_alias = kwargs.pop('validation_alias', None) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

233 self.serialization_alias = kwargs.pop('serialization_alias', None) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

234 alias_is_set = any(alias is not None for alias in (self.alias, self.validation_alias, self.serialization_alias)) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

235 self.alias_priority = kwargs.pop('alias_priority', None) or 2 if alias_is_set else None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

236 self.title = kwargs.pop('title', None) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

237 self.field_title_generator = kwargs.pop('field_title_generator', None) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

238 self.description = kwargs.pop('description', None) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

239 self.examples = kwargs.pop('examples', None) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

240 self.exclude = kwargs.pop('exclude', None) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

241 self.discriminator = kwargs.pop('discriminator', None) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

242 # For compatibility with FastAPI<=0.110.0, we preserve the existing value if it is not overridden 

243 self.deprecated = kwargs.pop('deprecated', getattr(self, 'deprecated', None)) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

244 self.repr = kwargs.pop('repr', True) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

245 self.json_schema_extra = kwargs.pop('json_schema_extra', None) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

246 self.validate_default = kwargs.pop('validate_default', None) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

247 self.frozen = kwargs.pop('frozen', None) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

248 # currently only used on dataclasses 

249 self.init = kwargs.pop('init', None) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

250 self.init_var = kwargs.pop('init_var', None) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

251 self.kw_only = kwargs.pop('kw_only', None) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

252 

253 self.metadata = self._collect_metadata(kwargs) # type: ignore 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

254 

255 # Private attributes: 

256 self._qualifiers: set[Qualifier] = set() 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

257 # Used to rebuild FieldInfo instances: 

258 self._complete = True 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

259 self._original_annotation: Any = PydanticUndefined 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

260 self._original_assignment: Any = PydanticUndefined 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

261 

262 @staticmethod 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

263 def from_field(default: Any = PydanticUndefined, **kwargs: Unpack[_FromFieldInfoInputs]) -> FieldInfo: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

264 """Create a new `FieldInfo` object with the `Field` function. 

265 

266 Args: 

267 default: The default value for the field. Defaults to Undefined. 

268 **kwargs: Additional arguments dictionary. 

269 

270 Raises: 

271 TypeError: If 'annotation' is passed as a keyword argument. 

272 

273 Returns: 

274 A new FieldInfo object with the given parameters. 

275 

276 Example: 

277 This is how you can create a field with default value like this: 

278 

279 ```python 

280 import pydantic 

281 

282 class MyModel(pydantic.BaseModel): 

283 foo: int = pydantic.Field(4) 

284 ``` 

285 """ 

286 if 'annotation' in kwargs: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

287 raise TypeError('"annotation" is not permitted as a Field keyword argument') 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

288 return FieldInfo(default=default, **kwargs) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

289 

290 @staticmethod 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

291 def from_annotation(annotation: type[Any], *, _source: AnnotationSource = AnnotationSource.ANY) -> FieldInfo: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

292 """Creates a `FieldInfo` instance from a bare annotation. 

293 

294 This function is used internally to create a `FieldInfo` from a bare annotation like this: 

295 

296 ```python 

297 import pydantic 

298 

299 class MyModel(pydantic.BaseModel): 

300 foo: int # <-- like this 

301 ``` 

302 

303 We also account for the case where the annotation can be an instance of `Annotated` and where 

304 one of the (not first) arguments in `Annotated` is an instance of `FieldInfo`, e.g.: 

305 

306 ```python 

307 from typing import Annotated 

308 

309 import annotated_types 

310 

311 import pydantic 

312 

313 class MyModel(pydantic.BaseModel): 

314 foo: Annotated[int, annotated_types.Gt(42)] 

315 bar: Annotated[int, pydantic.Field(gt=42)] 

316 ``` 

317 

318 Args: 

319 annotation: An annotation object. 

320 

321 Returns: 

322 An instance of the field metadata. 

323 """ 

324 try: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

325 inspected_ann = inspect_annotation( 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

326 annotation, 

327 annotation_source=_source, 

328 unpack_type_aliases='skip', 

329 ) 

330 except ForbiddenQualifier as e: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

331 raise PydanticForbiddenQualifier(e.qualifier, annotation) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

332 

333 # TODO check for classvar and error? 

334 

335 # No assigned value, this happens when using a bare `Final` qualifier (also for other 

336 # qualifiers, but they shouldn't appear here). In this case we infer the type as `Any` 

337 # because we don't have any assigned value. 

338 type_expr: Any = Any if inspected_ann.type is UNKNOWN else inspected_ann.type 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

339 final = 'final' in inspected_ann.qualifiers 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

340 metadata = inspected_ann.metadata 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

341 

342 if not metadata: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

343 # No metadata, e.g. `field: int`, or `field: Final[str]`: 

344 field_info = FieldInfo(annotation=type_expr, frozen=final or None) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

345 field_info._qualifiers = inspected_ann.qualifiers 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

346 return field_info 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

347 

348 # With metadata, e.g. `field: Annotated[int, Field(...), Gt(1)]`: 

349 field_info_annotations = [a for a in metadata if isinstance(a, FieldInfo)] 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

350 field_info = FieldInfo.merge_field_infos(*field_info_annotations, annotation=type_expr) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

351 

352 new_field_info = field_info._copy() 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

353 new_field_info.annotation = type_expr 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

354 new_field_info.frozen = final or field_info.frozen 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

355 field_metadata: list[Any] = [] 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

356 for a in metadata: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

357 if typing_objects.is_deprecated(a): 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

358 new_field_info.deprecated = a.message 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

359 elif not isinstance(a, FieldInfo): 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

360 field_metadata.append(a) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

361 else: 

362 field_metadata.extend(a.metadata) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

363 new_field_info.metadata = field_metadata 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

364 new_field_info._qualifiers = inspected_ann.qualifiers 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

365 return new_field_info 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

366 

367 @staticmethod 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

368 def from_annotated_attribute( 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

369 annotation: type[Any], default: Any, *, _source: AnnotationSource = AnnotationSource.ANY 

370 ) -> FieldInfo: 

371 """Create `FieldInfo` from an annotation with a default value. 

372 

373 This is used in cases like the following: 

374 

375 ```python 

376 from typing import Annotated 

377 

378 import annotated_types 

379 

380 import pydantic 

381 

382 class MyModel(pydantic.BaseModel): 

383 foo: int = 4 # <-- like this 

384 bar: Annotated[int, annotated_types.Gt(4)] = 4 # <-- or this 

385 spam: Annotated[int, pydantic.Field(gt=4)] = 4 # <-- or this 

386 ``` 

387 

388 Args: 

389 annotation: The type annotation of the field. 

390 default: The default value of the field. 

391 

392 Returns: 

393 A field object with the passed values. 

394 """ 

395 if annotation is default: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

396 raise PydanticUserError( 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

397 'Error when building FieldInfo from annotated attribute. ' 

398 "Make sure you don't have any field name clashing with a type annotation.", 

399 code='unevaluable-type-annotation', 

400 ) 

401 

402 try: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

403 inspected_ann = inspect_annotation( 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

404 annotation, 

405 annotation_source=_source, 

406 unpack_type_aliases='skip', 

407 ) 

408 except ForbiddenQualifier as e: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

409 raise PydanticForbiddenQualifier(e.qualifier, annotation) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

410 

411 # TODO check for classvar and error? 

412 

413 # TODO infer from the default, this can be done in v3 once we treat final fields with 

414 # a default as proper fields and not class variables: 

415 type_expr: Any = Any if inspected_ann.type is UNKNOWN else inspected_ann.type 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

416 final = 'final' in inspected_ann.qualifiers 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

417 metadata = inspected_ann.metadata 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

418 

419 if isinstance(default, FieldInfo): 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

420 # e.g. `field: int = Field(...)` 

421 default.annotation = type_expr 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

422 default.metadata += metadata 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

423 merged_default = FieldInfo.merge_field_infos( 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

424 *[x for x in metadata if isinstance(x, FieldInfo)], 

425 default, 

426 annotation=default.annotation, 

427 ) 

428 merged_default.frozen = final or merged_default.frozen 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

429 merged_default._qualifiers = inspected_ann.qualifiers 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

430 return merged_default 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

431 

432 if isinstance(default, dataclasses.Field): 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

433 # `collect_dataclass_fields()` passes the dataclass Field as a default. 

434 pydantic_field = FieldInfo._from_dataclass_field(default) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

435 pydantic_field.annotation = type_expr 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

436 pydantic_field.metadata += metadata 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

437 pydantic_field = FieldInfo.merge_field_infos( 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

438 *[x for x in metadata if isinstance(x, FieldInfo)], 

439 pydantic_field, 

440 annotation=pydantic_field.annotation, 

441 ) 

442 pydantic_field.frozen = final or pydantic_field.frozen 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

443 pydantic_field.init_var = 'init_var' in inspected_ann.qualifiers 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

444 pydantic_field.init = getattr(default, 'init', None) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

445 pydantic_field.kw_only = getattr(default, 'kw_only', None) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

446 pydantic_field._qualifiers = inspected_ann.qualifiers 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

447 return pydantic_field 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

448 

449 if not metadata: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

450 # No metadata, e.g. `field: int = ...`, or `field: Final[str] = ...`: 

451 field_info = FieldInfo(annotation=type_expr, default=default, frozen=final or None) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

452 field_info._qualifiers = inspected_ann.qualifiers 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

453 return field_info 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

454 

455 # With metadata, e.g. `field: Annotated[int, Field(...), Gt(1)] = ...`: 

456 field_infos = [a for a in metadata if isinstance(a, FieldInfo)] 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

457 field_info = FieldInfo.merge_field_infos(*field_infos, annotation=type_expr, default=default) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

458 field_metadata: list[Any] = [] 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

459 for a in metadata: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

460 if typing_objects.is_deprecated(a): 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

461 field_info.deprecated = a.message 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

462 elif not isinstance(a, FieldInfo): 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

463 field_metadata.append(a) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

464 else: 

465 field_metadata.extend(a.metadata) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

466 field_info.metadata = field_metadata 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

467 field_info._qualifiers = inspected_ann.qualifiers 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

468 return field_info 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

469 

470 @staticmethod 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

471 def merge_field_infos(*field_infos: FieldInfo, **overrides: Any) -> FieldInfo: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

472 """Merge `FieldInfo` instances keeping only explicitly set attributes. 

473 

474 Later `FieldInfo` instances override earlier ones. 

475 

476 Returns: 

477 FieldInfo: A merged FieldInfo instance. 

478 """ 

479 if len(field_infos) == 1: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

480 # No merging necessary, but we still need to make a copy and apply the overrides 

481 field_info = field_infos[0]._copy() 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

482 field_info._attributes_set.update(overrides) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

483 

484 default_override = overrides.pop('default', PydanticUndefined) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

485 if default_override is Ellipsis: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

486 default_override = PydanticUndefined 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

487 if default_override is not PydanticUndefined: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

488 field_info.default = default_override 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

489 

490 for k, v in overrides.items(): 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

491 setattr(field_info, k, v) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

492 return field_info # type: ignore 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

493 

494 merged_field_info_kwargs: dict[str, Any] = {} 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

495 metadata = {} 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

496 for field_info in field_infos: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

497 attributes_set = field_info._attributes_set.copy() 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

498 

499 try: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

500 json_schema_extra = attributes_set.pop('json_schema_extra') 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

501 existing_json_schema_extra = merged_field_info_kwargs.get('json_schema_extra') 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

502 

503 if existing_json_schema_extra is None: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

504 merged_field_info_kwargs['json_schema_extra'] = json_schema_extra 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

505 if isinstance(existing_json_schema_extra, dict): 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

506 if isinstance(json_schema_extra, dict): 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

507 merged_field_info_kwargs['json_schema_extra'] = { 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

508 **existing_json_schema_extra, 

509 **json_schema_extra, 

510 } 

511 if callable(json_schema_extra): 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

512 warn( 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

513 'Composing `dict` and `callable` type `json_schema_extra` is not supported.' 

514 'The `callable` type is being ignored.' 

515 "If you'd like support for this behavior, please open an issue on pydantic.", 

516 PydanticJsonSchemaWarning, 

517 ) 

518 elif callable(json_schema_extra): 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

519 # if ever there's a case of a callable, we'll just keep the last json schema extra spec 

520 merged_field_info_kwargs['json_schema_extra'] = json_schema_extra 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

521 except KeyError: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

522 pass 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

523 

524 # later FieldInfo instances override everything except json_schema_extra from earlier FieldInfo instances 

525 merged_field_info_kwargs.update(attributes_set) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

526 

527 for x in field_info.metadata: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

528 if not isinstance(x, FieldInfo): 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

529 metadata[type(x)] = x 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

530 

531 merged_field_info_kwargs.update(overrides) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

532 field_info = FieldInfo(**merged_field_info_kwargs) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

533 field_info.metadata = list(metadata.values()) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

534 return field_info 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

535 

536 @staticmethod 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

537 def _from_dataclass_field(dc_field: DataclassField[Any]) -> FieldInfo: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

538 """Return a new `FieldInfo` instance from a `dataclasses.Field` instance. 

539 

540 Args: 

541 dc_field: The `dataclasses.Field` instance to convert. 

542 

543 Returns: 

544 The corresponding `FieldInfo` instance. 

545 

546 Raises: 

547 TypeError: If any of the `FieldInfo` kwargs does not match the `dataclass.Field` kwargs. 

548 """ 

549 default = dc_field.default 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

550 if default is dataclasses.MISSING: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

551 default = _Unset 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

552 

553 if dc_field.default_factory is dataclasses.MISSING: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

554 default_factory = _Unset 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

555 else: 

556 default_factory = dc_field.default_factory 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

557 

558 # use the `Field` function so in correct kwargs raise the correct `TypeError` 

559 dc_field_metadata = {k: v for k, v in dc_field.metadata.items() if k in _FIELD_ARG_NAMES} 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

560 return Field(default=default, default_factory=default_factory, repr=dc_field.repr, **dc_field_metadata) # pyright: ignore[reportCallIssue] 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

561 

562 @staticmethod 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

563 def _collect_metadata(kwargs: dict[str, Any]) -> list[Any]: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

564 """Collect annotations from kwargs. 

565 

566 Args: 

567 kwargs: Keyword arguments passed to the function. 

568 

569 Returns: 

570 A list of metadata objects - a combination of `annotated_types.BaseMetadata` and 

571 `PydanticMetadata`. 

572 """ 

573 metadata: list[Any] = [] 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

574 general_metadata = {} 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

575 for key, value in list(kwargs.items()): 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

576 try: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

577 marker = FieldInfo.metadata_lookup[key] 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

578 except KeyError: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

579 continue 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

580 

581 del kwargs[key] 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

582 if value is not None: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

583 if marker is None: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

584 general_metadata[key] = value 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

585 else: 

586 metadata.append(marker(value)) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

587 if general_metadata: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

588 metadata.append(_fields.pydantic_general_metadata(**general_metadata)) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

589 return metadata 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

590 

591 def _copy(self) -> Self: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

592 copied = copy(self) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

593 for attr_name in ('metadata', '_attributes_set', '_qualifiers'): 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

594 # Apply "deep-copy" behavior on collections attributes: 

595 value = getattr(copied, attr_name).copy() 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

596 setattr(copied, attr_name, value) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

597 

598 return copied 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

599 

600 @property 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

601 def deprecation_message(self) -> str | None: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

602 """The deprecation message to be emitted, or `None` if not set.""" 

603 if self.deprecated is None: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

604 return None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

605 if isinstance(self.deprecated, bool): 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

606 return 'deprecated' if self.deprecated else None 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

607 return self.deprecated if isinstance(self.deprecated, str) else self.deprecated.message 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

608 

609 @property 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

610 def default_factory_takes_validated_data(self) -> bool | None: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

611 """Whether the provided default factory callable has a validated data parameter. 

612 

613 Returns `None` if no default factory is set. 

614 """ 

615 if self.default_factory is not None: 615 ↛ exitline 615 didn't return from function 'default_factory_takes_validated_data' because the condition on line 615 was always true1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

616 return _fields.takes_validated_data_argument(self.default_factory) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

617 

618 @overload 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

619 def get_default( 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

620 self, *, call_default_factory: Literal[True], validated_data: dict[str, Any] | None = None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

621 ) -> Any: ... 1jkabcqplmdefKLMJnoghi

622 

623 @overload 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

624 def get_default(self, *, call_default_factory: Literal[False] = ...) -> Any: ... 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

625 

626 def get_default(self, *, call_default_factory: bool = False, validated_data: dict[str, Any] | None = None) -> Any: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

627 """Get the default value. 

628 

629 We expose an option for whether to call the default_factory (if present), as calling it may 

630 result in side effects that we want to avoid. However, there are times when it really should 

631 be called (namely, when instantiating a model via `model_construct`). 

632 

633 Args: 

634 call_default_factory: Whether to call the default factory or not. 

635 validated_data: The already validated data to be passed to the default factory. 

636 

637 Returns: 

638 The default value, calling the default factory if requested or `None` if not set. 

639 """ 

640 if self.default_factory is None: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

641 return _utils.smart_deepcopy(self.default) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

642 elif call_default_factory: 642 ↛ 654line 642 didn't jump to line 654 because the condition on line 642 was always true1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

643 if self.default_factory_takes_validated_data: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

644 fac = cast('Callable[[dict[str, Any]], Any]', self.default_factory) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

645 if validated_data is None: 645 ↛ 646line 645 didn't jump to line 646 because the condition on line 645 was never true1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

646 raise ValueError( 

647 "The default factory requires the 'validated_data' argument, which was not provided when calling 'get_default'." 

648 ) 

649 return fac(validated_data) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

650 else: 

651 fac = cast('Callable[[], Any]', self.default_factory) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

652 return fac() 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

653 else: 

654 return None 

655 

656 def is_required(self) -> bool: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

657 """Check if the field is required (i.e., does not have a default value or factory). 

658 

659 Returns: 

660 `True` if the field is required, `False` otherwise. 

661 """ 

662 return self.default is PydanticUndefined and self.default_factory is None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

663 

664 def rebuild_annotation(self) -> Any: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

665 """Attempts to rebuild the original annotation for use in function signatures. 

666 

667 If metadata is present, it adds it to the original annotation using 

668 `Annotated`. Otherwise, it returns the original annotation as-is. 

669 

670 Note that because the metadata has been flattened, the original annotation 

671 may not be reconstructed exactly as originally provided, e.g. if the original 

672 type had unrecognized annotations, or was annotated with a call to `pydantic.Field`. 

673 

674 Returns: 

675 The rebuilt annotation. 

676 """ 

677 if not self.metadata: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

678 return self.annotation 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

679 else: 

680 # Annotated arguments must be a tuple 

681 return Annotated[(self.annotation, *self.metadata)] # type: ignore 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

682 

683 def apply_typevars_map( 1xyzArsjkabcBCDEtulmdefNOPKLMJFGHIvwnoghi

684 self, 

685 typevars_map: Mapping[TypeVar, Any] | None, 

686 globalns: GlobalsNamespace | None = None, 

687 localns: MappingNamespace | None = None, 

688 ) -> None: 

689 """Apply a `typevars_map` to the annotation. 

690 

691 This method is used when analyzing parametrized generic types to replace typevars with their concrete types. 

692 

693 This method applies the `typevars_map` to the annotation in place. 

694 

695 Args: 

696 typevars_map: A dictionary mapping type variables to their concrete types. 

697 globalns: The globals namespace to use during type annotation evaluation. 

698 localns: The locals namespace to use during type annotation evaluation. 

699 

700 See Also: 

701 pydantic._internal._generics.replace_types is used for replacing the typevars with 

702 their concrete types. 

703 """ 

704 annotation = _generics.replace_types(self.annotation, typevars_map) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

705 annotation, evaluated = _typing_extra.try_eval_type(annotation, globalns, localns) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

706 self.annotation = annotation 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

707 if not evaluated: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

708 self._complete = False 1rsjkabctulmdefvwnoghi

709 self._original_annotation = self.annotation 1rsjkabctulmdefvwnoghi

710 

711 def __repr_args__(self) -> ReprArgs: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

712 yield 'annotation', _repr.PlainRepr(_repr.display_as_type(self.annotation)) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

713 yield 'required', self.is_required() 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

714 

715 for s in self.__slots__: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

716 # TODO: properly make use of the protocol (https://rich.readthedocs.io/en/stable/pretty.html#rich-repr-protocol) 

717 # By yielding a three-tuple: 

718 if s in ( 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

719 'annotation', 

720 '_attributes_set', 

721 '_qualifiers', 

722 '_complete', 

723 '_original_assignment', 

724 '_original_annotation', 

725 ): 

726 continue 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

727 elif s == 'metadata' and not self.metadata: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

728 continue 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

729 elif s == 'repr' and self.repr is True: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

730 continue 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

731 if s == 'frozen' and self.frozen is False: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

732 continue 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

733 if s == 'validation_alias' and self.validation_alias == self.alias: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

734 continue 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

735 if s == 'serialization_alias' and self.serialization_alias == self.alias: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

736 continue 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

737 if s == 'default' and self.default is not PydanticUndefined: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

738 yield 'default', self.default 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

739 elif s == 'default_factory' and self.default_factory is not None: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

740 yield 'default_factory', _repr.PlainRepr(_repr.display_as_type(self.default_factory)) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

741 else: 

742 value = getattr(self, s) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

743 if value is not None and value is not PydanticUndefined: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

744 yield s, value 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

745 

746 

747class _EmptyKwargs(typing_extensions.TypedDict): 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

748 """This class exists solely to ensure that type checking warns about passing `**extra` in `Field`.""" 

749 

750 

751_DefaultValues = { 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

752 'default': ..., 

753 'default_factory': None, 

754 'alias': None, 

755 'alias_priority': None, 

756 'validation_alias': None, 

757 'serialization_alias': None, 

758 'title': None, 

759 'description': None, 

760 'examples': None, 

761 'exclude': None, 

762 'discriminator': None, 

763 'json_schema_extra': None, 

764 'frozen': None, 

765 'validate_default': None, 

766 'repr': True, 

767 'init': None, 

768 'init_var': None, 

769 'kw_only': None, 

770 'pattern': None, 

771 'strict': None, 

772 'gt': None, 

773 'ge': None, 

774 'lt': None, 

775 'le': None, 

776 'multiple_of': None, 

777 'allow_inf_nan': None, 

778 'max_digits': None, 

779 'decimal_places': None, 

780 'min_length': None, 

781 'max_length': None, 

782 'coerce_numbers_to_str': None, 

783} 

784 

785 

786_T = TypeVar('_T') 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

787 

788 

789# NOTE: Actual return type is 'FieldInfo', but we want to help type checkers 

790# to understand the magic that happens at runtime with the following overloads: 

791@overload # type hint the return value as `Any` to avoid type checking regressions when using `...`. 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

792def Field( 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

793 default: ellipsis, # noqa: F821 # TODO: use `_typing_extra.EllipsisType` when we drop Py3.9 1jkabcqplmdefKLMJnoghi

794 *, 

795 alias: str | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

796 alias_priority: int | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

797 validation_alias: str | AliasPath | AliasChoices | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

798 serialization_alias: str | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

799 title: str | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

800 field_title_generator: Callable[[str, FieldInfo], str] | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

801 description: str | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

802 examples: list[Any] | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

803 exclude: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

804 discriminator: str | types.Discriminator | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

805 deprecated: Deprecated | str | bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

806 json_schema_extra: JsonDict | Callable[[JsonDict], None] | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

807 frozen: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

808 validate_default: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

809 repr: bool = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

810 init: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

811 init_var: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

812 kw_only: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

813 pattern: str | typing.Pattern[str] | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

814 strict: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

815 coerce_numbers_to_str: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

816 gt: annotated_types.SupportsGt | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

817 ge: annotated_types.SupportsGe | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

818 lt: annotated_types.SupportsLt | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

819 le: annotated_types.SupportsLe | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

820 multiple_of: float | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

821 allow_inf_nan: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

822 max_digits: int | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

823 decimal_places: int | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

824 min_length: int | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

825 max_length: int | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

826 union_mode: Literal['smart', 'left_to_right'] = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

827 fail_fast: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

828 **extra: Unpack[_EmptyKwargs], 1jkabcqplmdefKLMJnoghi

829) -> Any: ... 1jkabcqplmdefKLMJnoghi

830@overload # `default` argument set 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

831def Field( 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

832 default: _T, 1jkabcqplmdefKLMJnoghi

833 *, 

834 alias: str | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

835 alias_priority: int | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

836 validation_alias: str | AliasPath | AliasChoices | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

837 serialization_alias: str | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

838 title: str | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

839 field_title_generator: Callable[[str, FieldInfo], str] | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

840 description: str | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

841 examples: list[Any] | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

842 exclude: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

843 discriminator: str | types.Discriminator | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

844 deprecated: Deprecated | str | bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

845 json_schema_extra: JsonDict | Callable[[JsonDict], None] | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

846 frozen: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

847 validate_default: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

848 repr: bool = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

849 init: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

850 init_var: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

851 kw_only: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

852 pattern: str | typing.Pattern[str] | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

853 strict: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

854 coerce_numbers_to_str: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

855 gt: annotated_types.SupportsGt | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

856 ge: annotated_types.SupportsGe | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

857 lt: annotated_types.SupportsLt | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

858 le: annotated_types.SupportsLe | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

859 multiple_of: float | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

860 allow_inf_nan: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

861 max_digits: int | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

862 decimal_places: int | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

863 min_length: int | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

864 max_length: int | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

865 union_mode: Literal['smart', 'left_to_right'] = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

866 fail_fast: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

867 **extra: Unpack[_EmptyKwargs], 1jkabcqplmdefKLMJnoghi

868) -> _T: ... 1jkabcqplmdefKLMJnoghi

869@overload # `default_factory` argument set 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

870def Field( 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

871 *, 

872 default_factory: Callable[[], _T] | Callable[[dict[str, Any]], _T], 1jkabcqplmdefKLMJnoghi

873 alias: str | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

874 alias_priority: int | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

875 validation_alias: str | AliasPath | AliasChoices | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

876 serialization_alias: str | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

877 title: str | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

878 field_title_generator: Callable[[str, FieldInfo], str] | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

879 description: str | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

880 examples: list[Any] | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

881 exclude: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

882 discriminator: str | types.Discriminator | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

883 deprecated: Deprecated | str | bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

884 json_schema_extra: JsonDict | Callable[[JsonDict], None] | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

885 frozen: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

886 validate_default: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

887 repr: bool = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

888 init: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

889 init_var: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

890 kw_only: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

891 pattern: str | typing.Pattern[str] | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

892 strict: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

893 coerce_numbers_to_str: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

894 gt: annotated_types.SupportsGt | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

895 ge: annotated_types.SupportsGe | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

896 lt: annotated_types.SupportsLt | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

897 le: annotated_types.SupportsLe | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

898 multiple_of: float | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

899 allow_inf_nan: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

900 max_digits: int | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

901 decimal_places: int | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

902 min_length: int | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

903 max_length: int | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

904 union_mode: Literal['smart', 'left_to_right'] = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

905 fail_fast: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

906 **extra: Unpack[_EmptyKwargs], 1jkabcqplmdefKLMJnoghi

907) -> _T: ... 1jkabcqplmdefKLMJnoghi

908@overload 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

909def Field( # No default set 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

910 *, 

911 alias: str | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

912 alias_priority: int | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

913 validation_alias: str | AliasPath | AliasChoices | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

914 serialization_alias: str | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

915 title: str | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

916 field_title_generator: Callable[[str, FieldInfo], str] | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

917 description: str | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

918 examples: list[Any] | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

919 exclude: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

920 discriminator: str | types.Discriminator | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

921 deprecated: Deprecated | str | bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

922 json_schema_extra: JsonDict | Callable[[JsonDict], None] | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

923 frozen: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

924 validate_default: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

925 repr: bool = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

926 init: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

927 init_var: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

928 kw_only: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

929 pattern: str | typing.Pattern[str] | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

930 strict: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

931 coerce_numbers_to_str: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

932 gt: annotated_types.SupportsGt | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

933 ge: annotated_types.SupportsGe | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

934 lt: annotated_types.SupportsLt | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

935 le: annotated_types.SupportsLe | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

936 multiple_of: float | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

937 allow_inf_nan: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

938 max_digits: int | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

939 decimal_places: int | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

940 min_length: int | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

941 max_length: int | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

942 union_mode: Literal['smart', 'left_to_right'] = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

943 fail_fast: bool | None = _Unset, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

944 **extra: Unpack[_EmptyKwargs], 1jkabcqplmdefKLMJnoghi

945) -> Any: ... 1jkabcqplmdefKLMJnoghi

946def Field( # noqa: C901 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

947 default: Any = PydanticUndefined, 

948 *, 

949 default_factory: Callable[[], Any] | Callable[[dict[str, Any]], Any] | None = _Unset, 

950 alias: str | None = _Unset, 

951 alias_priority: int | None = _Unset, 

952 validation_alias: str | AliasPath | AliasChoices | None = _Unset, 

953 serialization_alias: str | None = _Unset, 

954 title: str | None = _Unset, 

955 field_title_generator: Callable[[str, FieldInfo], str] | None = _Unset, 

956 description: str | None = _Unset, 

957 examples: list[Any] | None = _Unset, 

958 exclude: bool | None = _Unset, 

959 discriminator: str | types.Discriminator | None = _Unset, 

960 deprecated: Deprecated | str | bool | None = _Unset, 

961 json_schema_extra: JsonDict | Callable[[JsonDict], None] | None = _Unset, 

962 frozen: bool | None = _Unset, 

963 validate_default: bool | None = _Unset, 

964 repr: bool = _Unset, 

965 init: bool | None = _Unset, 

966 init_var: bool | None = _Unset, 

967 kw_only: bool | None = _Unset, 

968 pattern: str | typing.Pattern[str] | None = _Unset, 

969 strict: bool | None = _Unset, 

970 coerce_numbers_to_str: bool | None = _Unset, 

971 gt: annotated_types.SupportsGt | None = _Unset, 

972 ge: annotated_types.SupportsGe | None = _Unset, 

973 lt: annotated_types.SupportsLt | None = _Unset, 

974 le: annotated_types.SupportsLe | None = _Unset, 

975 multiple_of: float | None = _Unset, 

976 allow_inf_nan: bool | None = _Unset, 

977 max_digits: int | None = _Unset, 

978 decimal_places: int | None = _Unset, 

979 min_length: int | None = _Unset, 

980 max_length: int | None = _Unset, 

981 union_mode: Literal['smart', 'left_to_right'] = _Unset, 

982 fail_fast: bool | None = _Unset, 

983 **extra: Unpack[_EmptyKwargs], 

984) -> Any: 

985 """!!! abstract "Usage Documentation" 

986 [Fields](../concepts/fields.md) 

987 

988 Create a field for objects that can be configured. 

989 

990 Used to provide extra information about a field, either for the model schema or complex validation. Some arguments 

991 apply only to number fields (`int`, `float`, `Decimal`) and some apply only to `str`. 

992 

993 Note: 

994 - Any `_Unset` objects will be replaced by the corresponding value defined in the `_DefaultValues` dictionary. If a key for the `_Unset` object is not found in the `_DefaultValues` dictionary, it will default to `None` 

995 

996 Args: 

997 default: Default value if the field is not set. 

998 default_factory: A callable to generate the default value. The callable can either take 0 arguments 

999 (in which case it is called as is) or a single argument containing the already validated data. 

1000 alias: The name to use for the attribute when validating or serializing by alias. 

1001 This is often used for things like converting between snake and camel case. 

1002 alias_priority: Priority of the alias. This affects whether an alias generator is used. 

1003 validation_alias: Like `alias`, but only affects validation, not serialization. 

1004 serialization_alias: Like `alias`, but only affects serialization, not validation. 

1005 title: Human-readable title. 

1006 field_title_generator: A callable that takes a field name and returns title for it. 

1007 description: Human-readable description. 

1008 examples: Example values for this field. 

1009 exclude: Whether to exclude the field from the model serialization. 

1010 discriminator: Field name or Discriminator for discriminating the type in a tagged union. 

1011 deprecated: A deprecation message, an instance of `warnings.deprecated` or the `typing_extensions.deprecated` backport, 

1012 or a boolean. If `True`, a default deprecation message will be emitted when accessing the field. 

1013 json_schema_extra: A dict or callable to provide extra JSON schema properties. 

1014 frozen: Whether the field is frozen. If true, attempts to change the value on an instance will raise an error. 

1015 validate_default: If `True`, apply validation to the default value every time you create an instance. 

1016 Otherwise, for performance reasons, the default value of the field is trusted and not validated. 

1017 repr: A boolean indicating whether to include the field in the `__repr__` output. 

1018 init: Whether the field should be included in the constructor of the dataclass. 

1019 (Only applies to dataclasses.) 

1020 init_var: Whether the field should _only_ be included in the constructor of the dataclass. 

1021 (Only applies to dataclasses.) 

1022 kw_only: Whether the field should be a keyword-only argument in the constructor of the dataclass. 

1023 (Only applies to dataclasses.) 

1024 coerce_numbers_to_str: Whether to enable coercion of any `Number` type to `str` (not applicable in `strict` mode). 

1025 strict: If `True`, strict validation is applied to the field. 

1026 See [Strict Mode](../concepts/strict_mode.md) for details. 

1027 gt: Greater than. If set, value must be greater than this. Only applicable to numbers. 

1028 ge: Greater than or equal. If set, value must be greater than or equal to this. Only applicable to numbers. 

1029 lt: Less than. If set, value must be less than this. Only applicable to numbers. 

1030 le: Less than or equal. If set, value must be less than or equal to this. Only applicable to numbers. 

1031 multiple_of: Value must be a multiple of this. Only applicable to numbers. 

1032 min_length: Minimum length for iterables. 

1033 max_length: Maximum length for iterables. 

1034 pattern: Pattern for strings (a regular expression). 

1035 allow_inf_nan: Allow `inf`, `-inf`, `nan`. Only applicable to float and [`Decimal`][decimal.Decimal] numbers. 

1036 max_digits: Maximum number of allow digits for strings. 

1037 decimal_places: Maximum number of decimal places allowed for numbers. 

1038 union_mode: The strategy to apply when validating a union. Can be `smart` (the default), or `left_to_right`. 

1039 See [Union Mode](../concepts/unions.md#union-modes) for details. 

1040 fail_fast: If `True`, validation will stop on the first error. If `False`, all validation errors will be collected. 

1041 This option can be applied only to iterable types (list, tuple, set, and frozenset). 

1042 extra: (Deprecated) Extra fields that will be included in the JSON schema. 

1043 

1044 !!! warning Deprecated 

1045 The `extra` kwargs is deprecated. Use `json_schema_extra` instead. 

1046 

1047 Returns: 

1048 A new [`FieldInfo`][pydantic.fields.FieldInfo]. The return annotation is `Any` so `Field` can be used on 

1049 type-annotated fields without causing a type error. 

1050 """ 

1051 # Check deprecated and removed params from V1. This logic should eventually be removed. 

1052 const = extra.pop('const', None) # type: ignore 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1053 if const is not None: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1054 raise PydanticUserError('`const` is removed, use `Literal` instead', code='removed-kwargs') 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1055 

1056 min_items = extra.pop('min_items', None) # type: ignore 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1057 if min_items is not None: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1058 warn('`min_items` is deprecated and will be removed, use `min_length` instead', DeprecationWarning) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1059 if min_length in (None, _Unset): 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1060 min_length = min_items # type: ignore 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1061 

1062 max_items = extra.pop('max_items', None) # type: ignore 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1063 if max_items is not None: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1064 warn('`max_items` is deprecated and will be removed, use `max_length` instead', DeprecationWarning) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1065 if max_length in (None, _Unset): 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1066 max_length = max_items # type: ignore 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1067 

1068 unique_items = extra.pop('unique_items', None) # type: ignore 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1069 if unique_items is not None: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1070 raise PydanticUserError( 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1071 ( 

1072 '`unique_items` is removed, use `Set` instead' 

1073 '(this feature is discussed in https://github.com/pydantic/pydantic-core/issues/296)' 

1074 ), 

1075 code='removed-kwargs', 

1076 ) 

1077 

1078 allow_mutation = extra.pop('allow_mutation', None) # type: ignore 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1079 if allow_mutation is not None: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1080 warn('`allow_mutation` is deprecated and will be removed. use `frozen` instead', DeprecationWarning) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1081 if allow_mutation is False: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1082 frozen = True 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1083 

1084 regex = extra.pop('regex', None) # type: ignore 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1085 if regex is not None: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1086 raise PydanticUserError('`regex` is removed. use `pattern` instead', code='removed-kwargs') 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1087 

1088 if extra: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1089 warn( 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1090 'Using extra keyword arguments on `Field` is deprecated and will be removed.' 

1091 ' Use `json_schema_extra` instead.' 

1092 f' (Extra keys: {", ".join(k.__repr__() for k in extra.keys())})', 

1093 DeprecationWarning, 

1094 ) 

1095 if not json_schema_extra or json_schema_extra is _Unset: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1096 json_schema_extra = extra # type: ignore 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1097 

1098 if ( 1xyzArsqpBCDEtuNOPFGHIvw

1099 validation_alias 

1100 and validation_alias is not _Unset 

1101 and not isinstance(validation_alias, (str, AliasChoices, AliasPath)) 

1102 ): 

1103 raise TypeError('Invalid `validation_alias` type. it should be `str`, `AliasChoices`, or `AliasPath`') 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1104 

1105 if serialization_alias in (_Unset, None) and isinstance(alias, str): 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1106 serialization_alias = alias 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1107 

1108 if validation_alias in (_Unset, None): 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1109 validation_alias = alias 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1110 

1111 include = extra.pop('include', None) # type: ignore 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1112 if include is not None: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1113 warn('`include` is deprecated and does nothing. It will be removed, use `exclude` instead', DeprecationWarning) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1114 

1115 return FieldInfo.from_field( 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1116 default, 

1117 default_factory=default_factory, 

1118 alias=alias, 

1119 alias_priority=alias_priority, 

1120 validation_alias=validation_alias, 

1121 serialization_alias=serialization_alias, 

1122 title=title, 

1123 field_title_generator=field_title_generator, 

1124 description=description, 

1125 examples=examples, 

1126 exclude=exclude, 

1127 discriminator=discriminator, 

1128 deprecated=deprecated, 

1129 json_schema_extra=json_schema_extra, 

1130 frozen=frozen, 

1131 pattern=pattern, 

1132 validate_default=validate_default, 

1133 repr=repr, 

1134 init=init, 

1135 init_var=init_var, 

1136 kw_only=kw_only, 

1137 coerce_numbers_to_str=coerce_numbers_to_str, 

1138 strict=strict, 

1139 gt=gt, 

1140 ge=ge, 

1141 lt=lt, 

1142 le=le, 

1143 multiple_of=multiple_of, 

1144 min_length=min_length, 

1145 max_length=max_length, 

1146 allow_inf_nan=allow_inf_nan, 

1147 max_digits=max_digits, 

1148 decimal_places=decimal_places, 

1149 union_mode=union_mode, 

1150 fail_fast=fail_fast, 

1151 ) 

1152 

1153 

1154_FIELD_ARG_NAMES = set(inspect.signature(Field).parameters) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1155_FIELD_ARG_NAMES.remove('extra') # do not include the varkwargs parameter 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1156 

1157 

1158class ModelPrivateAttr(_repr.Representation): 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1159 """A descriptor for private attributes in class models. 

1160 

1161 !!! warning 

1162 You generally shouldn't be creating `ModelPrivateAttr` instances directly, instead use 

1163 `pydantic.fields.PrivateAttr`. (This is similar to `FieldInfo` vs. `Field`.) 

1164 

1165 Attributes: 

1166 default: The default value of the attribute if not provided. 

1167 default_factory: A callable function that generates the default value of the 

1168 attribute if not provided. 

1169 """ 

1170 

1171 __slots__ = ('default', 'default_factory') 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1172 

1173 def __init__( 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1174 self, default: Any = PydanticUndefined, *, default_factory: typing.Callable[[], Any] | None = None 

1175 ) -> None: 

1176 if default is Ellipsis: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1177 self.default = PydanticUndefined 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1178 else: 

1179 self.default = default 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1180 self.default_factory = default_factory 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1181 

1182 if not typing.TYPE_CHECKING: 1182 ↛ 1194line 1182 didn't jump to line 1194 because the condition on line 1182 was always true1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1183 # We put `__getattr__` in a non-TYPE_CHECKING block because otherwise, mypy allows arbitrary attribute access 

1184 

1185 def __getattr__(self, item: str) -> Any: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1186 """This function improves compatibility with custom descriptors by ensuring delegation happens 

1187 as expected when the default value of a private attribute is a descriptor. 

1188 """ 

1189 if item in {'__get__', '__set__', '__delete__'}: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1190 if hasattr(self.default, item): 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1191 return getattr(self.default, item) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1192 raise AttributeError(f'{type(self).__name__!r} object has no attribute {item!r}') 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1193 

1194 def __set_name__(self, cls: type[Any], name: str) -> None: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1195 """Preserve `__set_name__` protocol defined in https://peps.python.org/pep-0487.""" 

1196 default = self.default 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1197 if default is PydanticUndefined: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1198 return 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1199 set_name = getattr(default, '__set_name__', None) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1200 if callable(set_name): 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1201 set_name(cls, name) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1202 

1203 def get_default(self) -> Any: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1204 """Retrieve the default value of the object. 

1205 

1206 If `self.default_factory` is `None`, the method will return a deep copy of the `self.default` object. 

1207 

1208 If `self.default_factory` is not `None`, it will call `self.default_factory` and return the value returned. 

1209 

1210 Returns: 

1211 The default value of the object. 

1212 """ 

1213 return _utils.smart_deepcopy(self.default) if self.default_factory is None else self.default_factory() 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1214 

1215 def __eq__(self, other: Any) -> bool: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1216 return isinstance(other, self.__class__) and (self.default, self.default_factory) == ( 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1217 other.default, 

1218 other.default_factory, 

1219 ) 

1220 

1221 

1222# NOTE: Actual return type is 'ModelPrivateAttr', but we want to help type checkers 

1223# to understand the magic that happens at runtime. 

1224@overload # `default` argument set 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1225def PrivateAttr( 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1226 default: _T, 1jkabcqplmdefKLMJnoghi

1227 *, 

1228 init: Literal[False] = False, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1229) -> _T: ... 1jkabcqplmdefKLMJnoghi

1230@overload # `default_factory` argument set 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1231def PrivateAttr( 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1232 *, 

1233 default_factory: Callable[[], _T], 1jkabcqplmdefKLMJnoghi

1234 init: Literal[False] = False, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1235) -> _T: ... 1jkabcqplmdefKLMJnoghi

1236@overload # No default set 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1237def PrivateAttr( 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1238 *, 

1239 init: Literal[False] = False, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1240) -> Any: ... 1jkabcqplmdefKLMJnoghi

1241def PrivateAttr( 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1242 default: Any = PydanticUndefined, 

1243 *, 

1244 default_factory: Callable[[], Any] | None = None, 

1245 init: Literal[False] = False, 

1246) -> Any: 

1247 """!!! abstract "Usage Documentation" 

1248 [Private Model Attributes](../concepts/models.md#private-model-attributes) 

1249 

1250 Indicates that an attribute is intended for private use and not handled during normal validation/serialization. 

1251 

1252 Private attributes are not validated by Pydantic, so it's up to you to ensure they are used in a type-safe manner. 

1253 

1254 Private attributes are stored in `__private_attributes__` on the model. 

1255 

1256 Args: 

1257 default: The attribute's default value. Defaults to Undefined. 

1258 default_factory: Callable that will be 

1259 called when a default value is needed for this attribute. 

1260 If both `default` and `default_factory` are set, an error will be raised. 

1261 init: Whether the attribute should be included in the constructor of the dataclass. Always `False`. 

1262 

1263 Returns: 

1264 An instance of [`ModelPrivateAttr`][pydantic.fields.ModelPrivateAttr] class. 

1265 

1266 Raises: 

1267 ValueError: If both `default` and `default_factory` are set. 

1268 """ 

1269 if default is not PydanticUndefined and default_factory is not None: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1270 raise TypeError('cannot specify both default and default_factory') 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1271 

1272 return ModelPrivateAttr( 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1273 default, 

1274 default_factory=default_factory, 

1275 ) 

1276 

1277 

1278@dataclasses.dataclass(**_internal_dataclass.slots_true) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1279class ComputedFieldInfo: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1280 """A container for data from `@computed_field` so that we can access it while building the pydantic-core schema. 

1281 

1282 Attributes: 

1283 decorator_repr: A class variable representing the decorator string, '@computed_field'. 

1284 wrapped_property: The wrapped computed field property. 

1285 return_type: The type of the computed field property's return value. 

1286 alias: The alias of the property to be used during serialization. 

1287 alias_priority: The priority of the alias. This affects whether an alias generator is used. 

1288 title: Title of the computed field to include in the serialization JSON schema. 

1289 field_title_generator: A callable that takes a field name and returns title for it. 

1290 description: Description of the computed field to include in the serialization JSON schema. 

1291 deprecated: A deprecation message, an instance of `warnings.deprecated` or the `typing_extensions.deprecated` backport, 

1292 or a boolean. If `True`, a default deprecation message will be emitted when accessing the field. 

1293 examples: Example values of the computed field to include in the serialization JSON schema. 

1294 json_schema_extra: A dict or callable to provide extra JSON schema properties. 

1295 repr: A boolean indicating whether to include the field in the __repr__ output. 

1296 """ 

1297 

1298 decorator_repr: ClassVar[str] = '@computed_field' 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1299 wrapped_property: property 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1300 return_type: Any 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1301 alias: str | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1302 alias_priority: int | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1303 title: str | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1304 field_title_generator: typing.Callable[[str, ComputedFieldInfo], str] | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1305 description: str | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1306 deprecated: Deprecated | str | bool | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1307 examples: list[Any] | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1308 json_schema_extra: JsonDict | typing.Callable[[JsonDict], None] | None 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1309 repr: bool 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1310 

1311 @property 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1312 def deprecation_message(self) -> str | None: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1313 """The deprecation message to be emitted, or `None` if not set.""" 

1314 if self.deprecated is None: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1315 return None 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1316 if isinstance(self.deprecated, bool): 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1317 return 'deprecated' if self.deprecated else None 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1318 return self.deprecated if isinstance(self.deprecated, str) else self.deprecated.message 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1319 

1320 

1321def _wrapped_property_is_private(property_: cached_property | property) -> bool: # type: ignore 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1322 """Returns true if provided property is private, False otherwise.""" 

1323 wrapped_name: str = '' 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1324 

1325 if isinstance(property_, property): 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1326 wrapped_name = getattr(property_.fget, '__name__', '') 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1327 elif isinstance(property_, cached_property): # type: ignore 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1328 wrapped_name = getattr(property_.func, '__name__', '') # type: ignore 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1329 

1330 return wrapped_name.startswith('_') and not wrapped_name.startswith('__') 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1331 

1332 

1333# this should really be `property[T], cached_property[T]` but property is not generic unlike cached_property 

1334# See https://github.com/python/typing/issues/985 and linked issues 

1335PropertyT = typing.TypeVar('PropertyT') 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1336 

1337 

1338@typing.overload 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1339def computed_field(func: PropertyT, /) -> PropertyT: ... 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1340 

1341 

1342@typing.overload 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1343def computed_field( 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1344 *, 

1345 alias: str | None = None, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1346 alias_priority: int | None = None, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1347 title: str | None = None, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1348 field_title_generator: typing.Callable[[str, ComputedFieldInfo], str] | None = None, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1349 description: str | None = None, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1350 deprecated: Deprecated | str | bool | None = None, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1351 examples: list[Any] | None = None, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1352 json_schema_extra: JsonDict | typing.Callable[[JsonDict], None] | None = None, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1353 repr: bool = True, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1354 return_type: Any = PydanticUndefined, 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi

1355) -> typing.Callable[[PropertyT], PropertyT]: ... 1jkabcqplmdefKLMJnoghi

1356 

1357 

1358def computed_field( 1xyzArsjkabcBCDEtulmdefNOPKLMJFGHIvwnoghi

1359 func: PropertyT | None = None, 

1360 /, 

1361 *, 

1362 alias: str | None = None, 

1363 alias_priority: int | None = None, 

1364 title: str | None = None, 

1365 field_title_generator: typing.Callable[[str, ComputedFieldInfo], str] | None = None, 

1366 description: str | None = None, 

1367 deprecated: Deprecated | str | bool | None = None, 

1368 examples: list[Any] | None = None, 

1369 json_schema_extra: JsonDict | typing.Callable[[JsonDict], None] | None = None, 

1370 repr: bool | None = None, 

1371 return_type: Any = PydanticUndefined, 

1372) -> PropertyT | typing.Callable[[PropertyT], PropertyT]: 

1373 """!!! abstract "Usage Documentation" 

1374 [The `computed_field` decorator](../concepts/fields.md#the-computed_field-decorator) 

1375 

1376 Decorator to include `property` and `cached_property` when serializing models or dataclasses. 

1377 

1378 This is useful for fields that are computed from other fields, or for fields that are expensive to compute and should be cached. 

1379 

1380 ```python 

1381 from pydantic import BaseModel, computed_field 

1382 

1383 class Rectangle(BaseModel): 

1384 width: int 

1385 length: int 

1386 

1387 @computed_field 

1388 @property 

1389 def area(self) -> int: 

1390 return self.width * self.length 

1391 

1392 print(Rectangle(width=3, length=2).model_dump()) 

1393 #> {'width': 3, 'length': 2, 'area': 6} 

1394 ``` 

1395 

1396 If applied to functions not yet decorated with `@property` or `@cached_property`, the function is 

1397 automatically wrapped with `property`. Although this is more concise, you will lose IntelliSense in your IDE, 

1398 and confuse static type checkers, thus explicit use of `@property` is recommended. 

1399 

1400 !!! warning "Mypy Warning" 

1401 Even with the `@property` or `@cached_property` applied to your function before `@computed_field`, 

1402 mypy may throw a `Decorated property not supported` error. 

1403 See [mypy issue #1362](https://github.com/python/mypy/issues/1362), for more information. 

1404 To avoid this error message, add `# type: ignore[prop-decorator]` to the `@computed_field` line. 

1405 

1406 [pyright](https://github.com/microsoft/pyright) supports `@computed_field` without error. 

1407 

1408 ```python 

1409 import random 

1410 

1411 from pydantic import BaseModel, computed_field 

1412 

1413 class Square(BaseModel): 

1414 width: float 

1415 

1416 @computed_field 

1417 def area(self) -> float: # converted to a `property` by `computed_field` 

1418 return round(self.width**2, 2) 

1419 

1420 @area.setter 

1421 def area(self, new_area: float) -> None: 

1422 self.width = new_area**0.5 

1423 

1424 @computed_field(alias='the magic number', repr=False) 

1425 def random_number(self) -> int: 

1426 return random.randint(0, 1_000) 

1427 

1428 square = Square(width=1.3) 

1429 

1430 # `random_number` does not appear in representation 

1431 print(repr(square)) 

1432 #> Square(width=1.3, area=1.69) 

1433 

1434 print(square.random_number) 

1435 #> 3 

1436 

1437 square.area = 4 

1438 

1439 print(square.model_dump_json(by_alias=True)) 

1440 #> {"width":2.0,"area":4.0,"the magic number":3} 

1441 ``` 

1442 

1443 !!! warning "Overriding with `computed_field`" 

1444 You can't override a field from a parent class with a `computed_field` in the child class. 

1445 `mypy` complains about this behavior if allowed, and `dataclasses` doesn't allow this pattern either. 

1446 See the example below: 

1447 

1448 ```python 

1449 from pydantic import BaseModel, computed_field 

1450 

1451 class Parent(BaseModel): 

1452 a: str 

1453 

1454 try: 

1455 

1456 class Child(Parent): 

1457 @computed_field 

1458 @property 

1459 def a(self) -> str: 

1460 return 'new a' 

1461 

1462 except TypeError as e: 

1463 print(e) 

1464 ''' 

1465 Field 'a' of class 'Child' overrides symbol of same name in a parent class. This override with a computed_field is incompatible. 

1466 ''' 

1467 ``` 

1468 

1469 Private properties decorated with `@computed_field` have `repr=False` by default. 

1470 

1471 ```python 

1472 from functools import cached_property 

1473 

1474 from pydantic import BaseModel, computed_field 

1475 

1476 class Model(BaseModel): 

1477 foo: int 

1478 

1479 @computed_field 

1480 @cached_property 

1481 def _private_cached_property(self) -> int: 

1482 return -self.foo 

1483 

1484 @computed_field 

1485 @property 

1486 def _private_property(self) -> int: 

1487 return -self.foo 

1488 

1489 m = Model(foo=1) 

1490 print(repr(m)) 

1491 #> Model(foo=1) 

1492 ``` 

1493 

1494 Args: 

1495 func: the function to wrap. 

1496 alias: alias to use when serializing this computed field, only used when `by_alias=True` 

1497 alias_priority: priority of the alias. This affects whether an alias generator is used 

1498 title: Title to use when including this computed field in JSON Schema 

1499 field_title_generator: A callable that takes a field name and returns title for it. 

1500 description: Description to use when including this computed field in JSON Schema, defaults to the function's 

1501 docstring 

1502 deprecated: A deprecation message (or an instance of `warnings.deprecated` or the `typing_extensions.deprecated` backport). 

1503 to be emitted when accessing the field. Or a boolean. This will automatically be set if the property is decorated with the 

1504 `deprecated` decorator. 

1505 examples: Example values to use when including this computed field in JSON Schema 

1506 json_schema_extra: A dict or callable to provide extra JSON schema properties. 

1507 repr: whether to include this computed field in model repr. 

1508 Default is `False` for private properties and `True` for public properties. 

1509 return_type: optional return for serialization logic to expect when serializing to JSON, if included 

1510 this must be correct, otherwise a `TypeError` is raised. 

1511 If you don't include a return type Any is used, which does runtime introspection to handle arbitrary 

1512 objects. 

1513 

1514 Returns: 

1515 A proxy wrapper for the property. 

1516 """ 

1517 

1518 def dec(f: Any) -> Any: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1519 nonlocal description, deprecated, return_type, alias_priority 

1520 unwrapped = _decorators.unwrap_wrapped_function(f) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1521 

1522 if description is None and unwrapped.__doc__: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1523 description = inspect.cleandoc(unwrapped.__doc__) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1524 

1525 if deprecated is None and hasattr(unwrapped, '__deprecated__'): 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1526 deprecated = unwrapped.__deprecated__ 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1527 

1528 # if the function isn't already decorated with `@property` (or another descriptor), then we wrap it now 

1529 f = _decorators.ensure_property(f) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1530 alias_priority = (alias_priority or 2) if alias is not None else None 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1531 

1532 if repr is None: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1533 repr_: bool = not _wrapped_property_is_private(property_=f) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1534 else: 

1535 repr_ = repr 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1536 

1537 dec_info = ComputedFieldInfo( 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1538 f, 

1539 return_type, 

1540 alias, 

1541 alias_priority, 

1542 title, 

1543 field_title_generator, 

1544 description, 

1545 deprecated, 

1546 examples, 

1547 json_schema_extra, 

1548 repr_, 

1549 ) 

1550 return _decorators.PydanticDescriptorProxy(f, dec_info) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1551 

1552 if func is None: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1553 return dec 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi

1554 else: 

1555 return dec(func) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi