Guillaume Gelin 4 weeks ago
committed by GitHub
parent
commit
49b2fecab1
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 24
      fastapi/encoders.py

24
fastapi/encoders.py

@ -1,6 +1,6 @@
import dataclasses import dataclasses
import datetime import datetime
from collections import defaultdict, deque from collections import deque
from collections.abc import Callable from collections.abc import Callable
from decimal import Decimal from decimal import Decimal
from enum import Enum from enum import Enum
@ -112,20 +112,6 @@ ENCODERS_BY_TYPE: dict[type[Any], Callable[[Any], Any]] = {
} }
def generate_encoders_by_class_tuples(
type_encoder_map: dict[Any, Callable[[Any], Any]],
) -> dict[Callable[[Any], Any], tuple[Any, ...]]:
encoders_by_class_tuples: dict[Callable[[Any], Any], tuple[Any, ...]] = defaultdict(
tuple
)
for type_, encoder in type_encoder_map.items():
encoders_by_class_tuples[encoder] += (type_,)
return encoders_by_class_tuples
encoders_by_class_tuples = generate_encoders_by_class_tuples(ENCODERS_BY_TYPE)
def jsonable_encoder( def jsonable_encoder(
obj: Annotated[ obj: Annotated[
Any, Any,
@ -331,11 +317,9 @@ def jsonable_encoder(
) )
return encoded_list return encoded_list
if type(obj) in ENCODERS_BY_TYPE: for base in obj.__class__.__mro__[:-1]:
return ENCODERS_BY_TYPE[type(obj)](obj) if base in ENCODERS_BY_TYPE:
for encoder, classes_tuple in encoders_by_class_tuples.items(): return ENCODERS_BY_TYPE[base](obj)
if isinstance(obj, classes_tuple):
return encoder(obj)
if is_pydantic_v1_model_instance(obj): if is_pydantic_v1_model_instance(obj):
raise PydanticV1NotSupportedError( raise PydanticV1NotSupportedError(
"pydantic.v1 models are no longer supported by FastAPI." "pydantic.v1 models are no longer supported by FastAPI."

Loading…
Cancel
Save