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
« prev ^ index » next coverage.py v7.8.1, created at 2025-05-22 20:36 +0000
1"""Defining fields on models."""
3from __future__ import annotations as _annotations 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
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
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
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
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
39__all__ = 'Field', 'PrivateAttr', 'computed_field' 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
42_Unset: Any = PydanticUndefined 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
44if sys.version_info >= (3, 13): 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
45 import warnings 1abcdefJghi
47 Deprecated: TypeAlias = warnings.deprecated | deprecated 1abcdefJghi
48else:
49 Deprecated: TypeAlias = deprecated 1xyzArsjkqpBCDEtulmNOPKLMFGHIvwno
52class _FromFieldInfoInputs(typing_extensions.TypedDict, total=False): 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
53 """This class exists solely to add type checking for the `**kwargs` in `FieldInfo.from_field`."""
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
93class _FieldInfoInputs(_FromFieldInfoInputs, total=False): 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
94 """This class exists solely to add type checking for the `**kwargs` in `FieldInfo.__init__`."""
96 default: Any 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
99class FieldInfo(_repr.Representation): 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
100 """This class holds information about a field.
102 `FieldInfo` is used for any field definition regardless of whether the [`Field()`][pydantic.fields.Field]
103 function is explicitly used.
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.
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 """
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
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 )
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 }
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.
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
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
226 self.default_factory = kwargs.pop('default_factory', None) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
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
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
253 self.metadata = self._collect_metadata(kwargs) # type: ignore 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
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
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.
266 Args:
267 default: The default value for the field. Defaults to Undefined.
268 **kwargs: Additional arguments dictionary.
270 Raises:
271 TypeError: If 'annotation' is passed as a keyword argument.
273 Returns:
274 A new FieldInfo object with the given parameters.
276 Example:
277 This is how you can create a field with default value like this:
279 ```python
280 import pydantic
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
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.
294 This function is used internally to create a `FieldInfo` from a bare annotation like this:
296 ```python
297 import pydantic
299 class MyModel(pydantic.BaseModel):
300 foo: int # <-- like this
301 ```
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.:
306 ```python
307 from typing import Annotated
309 import annotated_types
311 import pydantic
313 class MyModel(pydantic.BaseModel):
314 foo: Annotated[int, annotated_types.Gt(42)]
315 bar: Annotated[int, pydantic.Field(gt=42)]
316 ```
318 Args:
319 annotation: An annotation object.
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
333 # TODO check for classvar and error?
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
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
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
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
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.
373 This is used in cases like the following:
375 ```python
376 from typing import Annotated
378 import annotated_types
380 import pydantic
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 ```
388 Args:
389 annotation: The type annotation of the field.
390 default: The default value of the field.
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 )
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
411 # TODO check for classvar and error?
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
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
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
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
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
470 @staticmethod 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
471 def merge_field_infos(*field_infos: FieldInfo, **overrides: Any) -> FieldInfo: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
472 """Merge `FieldInfo` instances keeping only explicitly set attributes.
474 Later `FieldInfo` instances override earlier ones.
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
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
490 for k, v in overrides.items(): 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
491 setattr(field_info, k, v) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
492 return field_info # type: ignore 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
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
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
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
524 # later FieldInfo instances override everything except json_schema_extra from earlier FieldInfo instances
525 merged_field_info_kwargs.update(attributes_set) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi
527 for x in field_info.metadata: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi
528 if not isinstance(x, FieldInfo): 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi
529 metadata[type(x)] = x 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi
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
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.
540 Args:
541 dc_field: The `dataclasses.Field` instance to convert.
543 Returns:
544 The corresponding `FieldInfo` instance.
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
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
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
562 @staticmethod 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
563 def _collect_metadata(kwargs: dict[str, Any]) -> list[Any]: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
564 """Collect annotations from kwargs.
566 Args:
567 kwargs: Keyword arguments passed to the function.
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
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
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
598 return copied 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
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
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.
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
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
623 @overload 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
624 def get_default(self, *, call_default_factory: Literal[False] = ...) -> Any: ... 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
626 def get_default(self, *, call_default_factory: bool = False, validated_data: dict[str, Any] | None = None) -> Any: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
627 """Get the default value.
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`).
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.
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
656 def is_required(self) -> bool: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
657 """Check if the field is required (i.e., does not have a default value or factory).
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
664 def rebuild_annotation(self) -> Any: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
665 """Attempts to rebuild the original annotation for use in function signatures.
667 If metadata is present, it adds it to the original annotation using
668 `Annotated`. Otherwise, it returns the original annotation as-is.
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`.
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
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.
691 This method is used when analyzing parametrized generic types to replace typevars with their concrete types.
693 This method applies the `typevars_map` to the annotation in place.
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.
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
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
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
747class _EmptyKwargs(typing_extensions.TypedDict): 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
748 """This class exists solely to ensure that type checking warns about passing `**extra` in `Field`."""
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}
786_T = TypeVar('_T') 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
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)
988 Create a field for objects that can be configured.
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`.
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`
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.
1044 !!! warning Deprecated
1045 The `extra` kwargs is deprecated. Use `json_schema_extra` instead.
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
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
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
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 )
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
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
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
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
1105 if serialization_alias in (_Unset, None) and isinstance(alias, str): 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
1106 serialization_alias = alias 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
1108 if validation_alias in (_Unset, None): 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
1109 validation_alias = alias 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
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
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 )
1154_FIELD_ARG_NAMES = set(inspect.signature(Field).parameters) 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
1155_FIELD_ARG_NAMES.remove('extra') # do not include the varkwargs parameter 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
1158class ModelPrivateAttr(_repr.Representation): 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
1159 """A descriptor for private attributes in class models.
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`.)
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 """
1171 __slots__ = ('default', 'default_factory') 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
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
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
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
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
1203 def get_default(self) -> Any: 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
1204 """Retrieve the default value of the object.
1206 If `self.default_factory` is `None`, the method will return a deep copy of the `self.default` object.
1208 If `self.default_factory` is not `None`, it will call `self.default_factory` and return the value returned.
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
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 )
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)
1250 Indicates that an attribute is intended for private use and not handled during normal validation/serialization.
1252 Private attributes are not validated by Pydantic, so it's up to you to ensure they are used in a type-safe manner.
1254 Private attributes are stored in `__private_attributes__` on the model.
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`.
1263 Returns:
1264 An instance of [`ModelPrivateAttr`][pydantic.fields.ModelPrivateAttr] class.
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
1272 return ModelPrivateAttr( 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi
1273 default,
1274 default_factory=default_factory,
1275 )
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.
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 """
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
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
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
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
1330 return wrapped_name.startswith('_') and not wrapped_name.startswith('__') 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi
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
1338@typing.overload 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
1339def computed_field(func: PropertyT, /) -> PropertyT: ... 1xyzArsjkabcqpBCDEtulmdefNOPKLMJFGHIvwnoghi
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
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)
1376 Decorator to include `property` and `cached_property` when serializing models or dataclasses.
1378 This is useful for fields that are computed from other fields, or for fields that are expensive to compute and should be cached.
1380 ```python
1381 from pydantic import BaseModel, computed_field
1383 class Rectangle(BaseModel):
1384 width: int
1385 length: int
1387 @computed_field
1388 @property
1389 def area(self) -> int:
1390 return self.width * self.length
1392 print(Rectangle(width=3, length=2).model_dump())
1393 #> {'width': 3, 'length': 2, 'area': 6}
1394 ```
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.
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.
1406 [pyright](https://github.com/microsoft/pyright) supports `@computed_field` without error.
1408 ```python
1409 import random
1411 from pydantic import BaseModel, computed_field
1413 class Square(BaseModel):
1414 width: float
1416 @computed_field
1417 def area(self) -> float: # converted to a `property` by `computed_field`
1418 return round(self.width**2, 2)
1420 @area.setter
1421 def area(self, new_area: float) -> None:
1422 self.width = new_area**0.5
1424 @computed_field(alias='the magic number', repr=False)
1425 def random_number(self) -> int:
1426 return random.randint(0, 1_000)
1428 square = Square(width=1.3)
1430 # `random_number` does not appear in representation
1431 print(repr(square))
1432 #> Square(width=1.3, area=1.69)
1434 print(square.random_number)
1435 #> 3
1437 square.area = 4
1439 print(square.model_dump_json(by_alias=True))
1440 #> {"width":2.0,"area":4.0,"the magic number":3}
1441 ```
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:
1448 ```python
1449 from pydantic import BaseModel, computed_field
1451 class Parent(BaseModel):
1452 a: str
1454 try:
1456 class Child(Parent):
1457 @computed_field
1458 @property
1459 def a(self) -> str:
1460 return 'new a'
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 ```
1469 Private properties decorated with `@computed_field` have `repr=False` by default.
1471 ```python
1472 from functools import cached_property
1474 from pydantic import BaseModel, computed_field
1476 class Model(BaseModel):
1477 foo: int
1479 @computed_field
1480 @cached_property
1481 def _private_cached_property(self) -> int:
1482 return -self.foo
1484 @computed_field
1485 @property
1486 def _private_property(self) -> int:
1487 return -self.foo
1489 m = Model(foo=1)
1490 print(repr(m))
1491 #> Model(foo=1)
1492 ```
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.
1514 Returns:
1515 A proxy wrapper for the property.
1516 """
1518 def dec(f: Any) -> Any: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi
1519 nonlocal description, deprecated, return_type, alias_priority
1520 unwrapped = _decorators.unwrap_wrapped_function(f) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi
1522 if description is None and unwrapped.__doc__: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi
1523 description = inspect.cleandoc(unwrapped.__doc__) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi
1525 if deprecated is None and hasattr(unwrapped, '__deprecated__'): 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi
1526 deprecated = unwrapped.__deprecated__ 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi
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
1532 if repr is None: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi
1533 repr_: bool = not _wrapped_property_is_private(property_=f) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi
1534 else:
1535 repr_ = repr 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi
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
1552 if func is None: 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi
1553 return dec 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi
1554 else:
1555 return dec(func) 1xyzArsjkabcqpBCDEtulmdefFGHIvwnoghi