From 40e2198b15a05fbb55ca9cc430873e49d523f37e Mon Sep 17 00:00:00 2001 From: valbort Date: Fri, 22 May 2026 10:54:52 +0300 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=20Cache=20pydantic.v1=20import=20to?= =?UTF-8?q?=20minimize=20compatibility=20overhead?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Moving the import of pydantic.v1 and the warnings filter to the module level avoids executing them on every single object serialization in jsonable_encoder, significantly boosting performance for Pydantic v1 backward compatibility checks. --- fastapi/_compat/shared.py | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/fastapi/_compat/shared.py b/fastapi/_compat/shared.py index bd38c55344..bc2fdeefbc 100644 --- a/fastapi/_compat/shared.py +++ b/fastapi/_compat/shared.py @@ -175,28 +175,29 @@ def is_uploadfile_sequence_annotation(annotation: Any) -> bool: ) +try: + with warnings.catch_warnings(): + warnings.simplefilter("ignore", UserWarning) + from pydantic import v1 as _pydantic_v1 + _PydanticV1BaseModel = _pydantic_v1.BaseModel +except ImportError: # pragma: no cover + _PydanticV1BaseModel = None + + def is_pydantic_v1_model_instance(obj: Any) -> bool: # TODO: remove this function once the required version of Pydantic fully # removes pydantic.v1 - try: - with warnings.catch_warnings(): - warnings.simplefilter("ignore", UserWarning) - from pydantic import v1 - except ImportError: # pragma: no cover + if _PydanticV1BaseModel is None: return False - return isinstance(obj, v1.BaseModel) + return isinstance(obj, _PydanticV1BaseModel) def is_pydantic_v1_model_class(cls: Any) -> bool: # TODO: remove this function once the required version of Pydantic fully # removes pydantic.v1 - try: - with warnings.catch_warnings(): - warnings.simplefilter("ignore", UserWarning) - from pydantic import v1 - except ImportError: # pragma: no cover + if _PydanticV1BaseModel is None: return False - return lenient_issubclass(cls, v1.BaseModel) + return lenient_issubclass(cls, _PydanticV1BaseModel) def annotation_is_pydantic_v1(annotation: Any) -> bool: