From d57cd4f379006db9d52ff2c523f6f4b933768999 Mon Sep 17 00:00:00 2001 From: merlinz01 Date: Thu, 5 Sep 2024 21:58:36 -0400 Subject: [PATCH] make compatible with Python <3.10 and Pydantic v1 Signed-off-by: merlinz01 --- fastapi/dependencies/utils.py | 21 ++++++++++++++------ tests/test_none_passed_when_null_received.py | 4 ++-- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index a00888751..531e708e8 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -1,4 +1,5 @@ import inspect +import sys import types from contextlib import AsyncExitStack, contextmanager from copy import copy, deepcopy @@ -669,12 +670,20 @@ async def solve_dependencies( dependency_cache=dependency_cache, ) - -def _allows_none(field: ModelField) -> bool: - origin = get_origin(field.type_) - return (origin is Union or origin is types.UnionType) and type(None) in get_args( - field.type_ - ) +if PYDANTIC_V2: + if sys.hexversion >= 0x30a00000: + def _allows_none(field: ModelField) -> bool: + origin = get_origin(field.type_) + return (origin is Union or origin is types.UnionType) and type(None) in get_args( + field.type_ + ) + else: + def _allows_none(field: ModelField) -> bool: + origin = get_origin(field.type_) + return origin is Union and type(None) in get_args(field.type_) +else: + def _allows_none(field: ModelField) -> bool: + return field.allow_none def _validate_value_with_model_field( diff --git a/tests/test_none_passed_when_null_received.py b/tests/test_none_passed_when_null_received.py index 4d1b3b0a8..c4ce6f8b7 100644 --- a/tests/test_none_passed_when_null_received.py +++ b/tests/test_none_passed_when_null_received.py @@ -10,7 +10,7 @@ DEFAULT = 1234567890 endpoints = [] -if sys.hexversion >= 0x31000000: +if sys.hexversion >= 0x30a0000: from typing import Annotated @app.post("/api1") @@ -22,7 +22,7 @@ if sys.hexversion >= 0x31000000: endpoints.append("/api1") -if sys.hexversion >= 0x30900000: +if sys.hexversion >= 0x3090000: from typing import Annotated @app.post("/api2")