From c543be18f09b0b3130e2ece189420128bde582eb Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Tue, 27 Jan 2026 15:58:38 +0000 Subject: [PATCH] linting --- docs_src/query_params/tutorial007_py310.py | 8 ++++---- fastapi/_compat/__init__.py | 9 +++++---- fastapi/_compat/v2.py | 7 +------ fastapi/dependencies/utils.py | 13 +++++-------- tests/test_invalid_mapping_param.py | 3 +-- 5 files changed, 16 insertions(+), 24 deletions(-) diff --git a/docs_src/query_params/tutorial007_py310.py b/docs_src/query_params/tutorial007_py310.py index 44939b620f..848dd57bb8 100644 --- a/docs_src/query_params/tutorial007_py310.py +++ b/docs_src/query_params/tutorial007_py310.py @@ -1,4 +1,4 @@ -from typing import Annotated, Dict, List +from typing import Annotated from fastapi import FastAPI, Query @@ -8,9 +8,9 @@ app = FastAPI() @app.get("/query/mixed-type-params") def get_mixed_mapping_mixed_type_query_params( query: Annotated[int, Query()] = None, - mapping_query_str: Annotated[Dict[str, str], Query()] = None, - mapping_query_int: Annotated[Dict[str, int], Query()] = None, - sequence_mapping_int: Annotated[Dict[str, List[int]], Query()] = None, + mapping_query_str: Annotated[dict[str, str], Query()] = None, + mapping_query_int: Annotated[dict[str, int], Query()] = None, + sequence_mapping_int: Annotated[dict[str, list[int]], Query()] = None, ): return { "query": query, diff --git a/fastapi/_compat/__init__.py b/fastapi/_compat/__init__.py index 17ca2f27cc..0ea6ca32fc 100644 --- a/fastapi/_compat/__init__.py +++ b/fastapi/_compat/__init__.py @@ -2,14 +2,14 @@ from .shared import PYDANTIC_V2 as PYDANTIC_V2 from .shared import PYDANTIC_VERSION_MINOR_TUPLE as PYDANTIC_VERSION_MINOR_TUPLE from .shared import annotation_is_pydantic_v1 as annotation_is_pydantic_v1 from .shared import field_annotation_is_scalar as field_annotation_is_scalar -from .shared import is_pydantic_v1_model_class as is_pydantic_v1_model_class -from .shared import is_pydantic_v1_model_instance as is_pydantic_v1_model_instance from .shared import ( field_annotation_is_scalar_mapping as field_annotation_is_scalar_mapping, ) from .shared import ( field_annotation_is_scalar_sequence_mapping as field_annotation_is_scalar_sequence_mapping, ) +from .shared import is_pydantic_v1_model_class as is_pydantic_v1_model_class +from .shared import is_pydantic_v1_model_instance as is_pydantic_v1_model_instance from .shared import ( is_uploadfile_or_nonable_uploadfile_annotation as is_uploadfile_or_nonable_uploadfile_annotation, ) @@ -39,11 +39,12 @@ from .v2 import get_schema_from_model_field as get_schema_from_model_field from .v2 import is_bytes_field as is_bytes_field from .v2 import is_bytes_sequence_field as is_bytes_sequence_field from .v2 import is_scalar_field as is_scalar_field +from .v2 import is_scalar_mapping_field as is_scalar_mapping_field from .v2 import is_scalar_sequence_field as is_scalar_sequence_field +from .v2 import is_scalar_sequence_mapping_field as is_scalar_sequence_mapping_field from .v2 import is_sequence_field as is_sequence_field +from .v2 import omit_by_default as omit_by_default from .v2 import serialize_sequence_value as serialize_sequence_value from .v2 import ( with_info_plain_validator_function as with_info_plain_validator_function, ) -from .v2 import is_scalar_mapping_field as is_scalar_mapping_field -from .v2 import is_scalar_sequence_mapping_field as is_scalar_sequence_mapping_field \ No newline at end of file diff --git a/fastapi/_compat/v2.py b/fastapi/_compat/v2.py index 69877d01a5..f2ee4fcec2 100644 --- a/fastapi/_compat/v2.py +++ b/fastapi/_compat/v2.py @@ -5,12 +5,7 @@ from copy import copy, deepcopy from dataclasses import dataclass, is_dataclass from enum import Enum from functools import lru_cache -from typing import ( - Annotated, - Any, - Union, - cast, -) +from typing import Annotated, Any, Callable, Union, cast from fastapi._compat import shared from fastapi.openapi.constants import REF_TEMPLATE diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index f2d354770e..a1d44143fd 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -26,6 +26,8 @@ from fastapi._compat import ( create_body_model, evaluate_forwardref, field_annotation_is_scalar, + field_annotation_is_scalar_mapping, + field_annotation_is_scalar_sequence_mapping, get_cached_model_fields, get_missing_field_error, is_bytes_field, @@ -38,11 +40,10 @@ from fastapi._compat import ( is_uploadfile_or_nonable_uploadfile_annotation, is_uploadfile_sequence_annotation, lenient_issubclass, + omit_by_default, sequence_types, serialize_sequence_value, value_is_sequence, - field_annotation_is_scalar_mapping, - field_annotation_is_scalar_sequence_mapping, ) from fastapi.background import BackgroundTasks from fastapi.concurrency import ( @@ -505,8 +506,8 @@ def analyze_param( field_info.alias = alias # Omit by default for scalar mapping and scalar sequence mapping query fields - class_validators: Dict[str, Callable[..., Any]] = {} - if isinstance(field_info, (params.Query, temp_pydantic_v1_params.Query)) and ( + class_validators: dict[str, Callable[..., Any]] = {} + if isinstance(field_info, params.Query) and ( field_annotation_is_scalar_sequence_mapping(use_annotation_from_field_info) or field_annotation_is_scalar_mapping(use_annotation_from_field_info) ): @@ -727,10 +728,6 @@ def _validate_value_with_model_field( return deepcopy(field.default), [] v_, errors_ = field.validate(value, values, loc=loc) - if _is_error_wrapper(errors_): # type: ignore[arg-type] - return None, [errors_] - elif isinstance(errors_, list): - new_errors = may_v1._regenerate_error_with_loc(errors=errors_, loc_prefix=()) if isinstance(errors_, list): new_errors = _regenerate_error_with_loc(errors=errors_, loc_prefix=()) return None, new_errors diff --git a/tests/test_invalid_mapping_param.py b/tests/test_invalid_mapping_param.py index a9a48874b1..b73337cfef 100644 --- a/tests/test_invalid_mapping_param.py +++ b/tests/test_invalid_mapping_param.py @@ -1,4 +1,3 @@ -from typing import Dict, List import pytest from fastapi import FastAPI, Query @@ -9,5 +8,5 @@ def test_invalid_sequence(): app = FastAPI() @app.get("/items/") - def read_items(q: Dict[str, List[List[str]]] = Query(default=None)): + def read_items(q: dict[str, list[list[str]]] = Query(default=None)): pass # pragma: no cover