The code released in v2.10.0 is practically identical to that of v2.10.0b2.
See the v2.10 release blog post for the highlights!
What's Changed
Packaging
- Bump
pydantic-core
tov2.27.0
by @sydney-runkle in #10825 - Replaced pdm with uv by @frfahim in #10727
New Features
- Support
fractions.Fraction
by @sydney-runkle in #10318 - Support
Hashable
for json validation by @sydney-runkle in #10324 - Add a
SocketPath
type forlinux
systems by @theunkn0wn1 in #10378 - Allow arbitrary refs in JSON schema
examples
by @sydney-runkle in #10417 - Support
defer_build
for Pydantic dataclasses by @Viicos in #10313 - Adding v1 / v2 incompatibility warning for nested v1 model by @sydney-runkle in #10431
- Add support for unpacked
TypedDict
to type hint variadic keyword arguments with@validate_call
by @Viicos in #10416 - Support compiled patterns in
protected_namespaces
by @sydney-runkle in #10522 - Add support for
propertyNames
in JSON schema by @FlorianSW in #10478 - Adding
__replace__
protocol for Python 3.13+ support by @sydney-runkle in #10596 - Expose public
sort
method for JSON schema generation by @sydney-runkle in #10595 - Add runtime validation of
@validate_call
callable argument by @kc0506 in #10627 - Add
experimental_allow_partial
support by @samuelcolvin in #10748 - Support default factories taking validated data as an argument by @Viicos in #10678
- Allow subclassing
ValidationError
andPydanticCustomError
by @Youssefares in pydantic/pydantic-core#1413 - Add
trailing-strings
support toexperimental_allow_partial
by @sydney-runkle in #10825 - Add
rebuild()
method forTypeAdapter
and simplifydefer_build
patterns by @sydney-runkle in #10537 - Improve
TypeAdapter
instance repr by @sydney-runkle in #10872
Changes
- Don't allow customization of
SchemaGenerator
until interface is more stable by @sydney-runkle in #10303 - Cleanly
defer_build
onTypeAdapters
, removing experimental flag by @sydney-runkle in #10329 - Fix
mro
of generic subclass by @kc0506 in #10100 - Strip whitespaces on JSON Schema title generation by @sydney-runkle in #10404
- Use
b64decode
andb64encode
forBase64Bytes
type by @sydney-runkle in #10486 - Relax protected namespace config default by @sydney-runkle in #10441
- Revalidate parametrized generics if instance's origin is subclass of OG class by @sydney-runkle in #10666
- Warn if configuration is specified on the
@dataclass
decorator and with the__pydantic_config__
attribute by @sydney-runkle in #10406 - Recommend against using
Ellipsis
(...) withField
by @Viicos in #10661 - Migrate to subclassing instead of annotated approach for pydantic url types by @sydney-runkle in #10662
- Change JSON schema generation of
Literal
s andEnums
by @Viicos in #10692 - Simplify unions involving
Any
orNever
when replacing type variables by @Viicos in #10338 - Do not require padding when decoding
base64
bytes by @bschoenmaeckers in pydantic/pydantic-core#1448 - Support dates all the way to 1BC by @changhc in pydantic/speedate#77
Performance
- Schema cleaning: skip unnecessary copies during schema walking by @Viicos in #10286
- Refactor namespace logic for annotations evaluation by @Viicos in #10530
- Improve email regexp on edge cases by @AlekseyLobanov in #10601
CoreMetadata
refactor with an emphasis on documentation, schema build time performance, and reducing complexity by @sydney-runkle in #10675
Fixes
- Remove guarding check on
computed_field
withfield_serializer
by @nix010 in #10390 - Fix
Predicate
issue inv2.9.0
by @sydney-runkle in #10321 - Fixing
annotated-types
bound by @sydney-runkle in #10327 - Turn
tzdata
install requirement into optionaltimezone
dependency by @jakob-keller in #10331 - Use correct types namespace when building
namedtuple
core schemas by @Viicos in #10337 - Fix evaluation of stringified annotations during namespace inspection by @Viicos in #10347
- Fix
IncEx
type alias definition by @Viicos in #10339 - Do not error when trying to evaluate annotations of private attributes by @Viicos in #10358
- Fix nested type statement by @kc0506 in #10369
- Improve typing of
ModelMetaclass.mro
by @Viicos in #10372 - Fix class access of deprecated
computed_field
s by @Viicos in #10391 - Make sure
inspect.iscoroutinefunction
works on coroutines decorated with@validate_call
by @MovisLi in #10374 - Fix
NameError
when usingvalidate_call
with PEP 695 on a class by @kc0506 in #10380 - Fix
ZoneInfo
with various invalid types by @sydney-runkle in #10408 - Fix
PydanticUserError
on emptymodel_config
with annotations by @cdwilson in #10412 - Fix variance issue in
_IncEx
type alias, only allowTrue
by @Viicos in #10414 - Fix serialization schema generation when using
PlainValidator
by @Viicos in #10427 - Fix schema generation error when serialization schema holds references by @Viicos in #10444
- Inline references if possible when generating schema for
json_schema_input_type
by @Viicos in #10439 - Fix recursive arguments in
Representation
by @Viicos in #10480 - Fix representation for builtin function types by @kschwab in #10479
- Add python validators for decimal constraints (
max_digits
anddecimal_places
) by @sydney-runkle in #10506 - Only fetch
__pydantic_core_schema__
from the current class during schema generation by @Viicos in #10518 - Fix
stacklevel
on deprecation warnings forBaseModel
by @sydney-runkle in #10520 - Fix warning
stacklevel
inBaseModel.__init__
by @Viicos in #10526 - Improve error handling for in-evaluable refs for discriminator application by @sydney-runkle in #10440
- Change the signature of
ConfigWrapper.core_config
to take the title directly by @Viicos in #10562 - Do not use the previous config from the stack for dataclasses without config by @Viicos in #10576
- Fix serialization for IP types with
mode='python'
by @sydney-runkle in #10594 - Support constraint application for
Base64Etc
types by @sydney-runkle in #10584 - Fix
validate_call
ignoringField
inAnnotated
by @kc0506 in #10610 - Raise an error when
Self
is invalid by @kc0506 in #10609 - Using
core_schema.InvalidSchema
instead of metadata injection + checks by @sydney-runkle in #10523 - Tweak type alias logic by @kc0506 in #10643
- Support usage of
type
withtyping.Self
and type aliases by @kc0506 in #10621 - Use overloads for
Field
andPrivateAttr
functions by @Viicos in #10651 - Clean up the
mypy
plugin implementation by @Viicos in #10669 - Properly check for
typing_extensions
variant ofTypeAliasType
by @Daraan in #10713 - Allow any mapping in
BaseModel.model_copy()
by @Viicos in #10751 - Fix
isinstance
behavior for urls by @sydney-runkle in #10766 - Ensure
cached_property
can be set on Pydantic models by @Viicos in #10774 - Fix equality checks for primitives in literals by @sydney-runkle in pydantic/pydantic-core#1459
- Properly enforce
host_required
for URLs by @Viicos in pydantic/pydantic-core#1488 - Fix when
coerce_numbers_to_str
enabled and string has invalid Unicode character by @andrey-berenda in pydantic/pydantic-core#1515 - Fix serializing
complex
values inEnum
s by @changhc in pydantic/pydantic-core#1524 - Refactor
_typing_extra
module by @Viicos in #10725 - Support intuitive equality for urls by @sydney-runkle in #10798
- Add
bytearray
toTypeAdapter.validate_json
signature by @samuelcolvin in #10802 - Ensure class access of method descriptors is performed when used as a default with
Field
by @Viicos in #10816 - Fix circular import with
validate_call
by @sydney-runkle in #10807 - Fix error when using type aliases referencing other type aliases by @Viicos in #10809
- Fix
IncEx
type alias to be compatible with mypy by @Viicos in #10813 - Make
__signature__
a lazy property, do not deepcopy defaults by @Viicos in #10818 - Make
__signature__
lazy for dataclasses, too by @sydney-runkle in #10832 - Subclass all single host url classes from
AnyUrl
to preserve behavior from v2.9 by @sydney-runkle in #10856
New Contributors
- @jakob-keller made their first contribution in #10331
- @MovisLi made their first contribution in #10374
- @joaopalmeiro made their first contribution in #10405
- @theunkn0wn1 made their first contribution in #10378
- @cdwilson made their first contribution in #10412
- @dlax made their first contribution in #10421
- @kschwab made their first contribution in #10479
- @santibreo made their first contribution in #10453
- @FlorianSW made their first contribution in #10478
- @tkasuz made their first contribution in #10555
- @AlekseyLobanov made their first contribution in #10601
- @NiclasvanEyk made their first contribution in #10667
- @mschoettle made their first contribution in #10677
- @Daraan made their first contribution in #10713
- @k4nar made their first contribution in #10736
- @UriyaHarpeness made their first contribution in #10740
- @frfahim made their first contribution in #10727