cohere-python

Форк
0
/
jsonable_encoder.py 
103 строки · 3.7 Кб
1
# This file was auto-generated by Fern from our API Definition.
2

3
"""
4
jsonable_encoder converts a Python object to a JSON-friendly dict
5
(e.g. datetimes to strings, Pydantic models to dicts).
6

7
Taken from FastAPI, and made a bit simpler
8
https://github.com/tiangolo/fastapi/blob/master/fastapi/encoders.py
9
"""
10

11
import dataclasses
12
import datetime as dt
13
from collections import defaultdict
14
from enum import Enum
15
from pathlib import PurePath
16
from types import GeneratorType
17
from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Union
18

19
try:
20
    import pydantic.v1 as pydantic  # type: ignore
21
except ImportError:
22
    import pydantic  # type: ignore
23

24
from .datetime_utils import serialize_datetime
25

26
SetIntStr = Set[Union[int, str]]
27
DictIntStrAny = Dict[Union[int, str], Any]
28

29

30
def generate_encoders_by_class_tuples(
31
    type_encoder_map: Dict[Any, Callable[[Any], Any]]
32
) -> Dict[Callable[[Any], Any], Tuple[Any, ...]]:
33
    encoders_by_class_tuples: Dict[Callable[[Any], Any], Tuple[Any, ...]] = defaultdict(tuple)
34
    for type_, encoder in type_encoder_map.items():
35
        encoders_by_class_tuples[encoder] += (type_,)
36
    return encoders_by_class_tuples
37

38

39
encoders_by_class_tuples = generate_encoders_by_class_tuples(pydantic.json.ENCODERS_BY_TYPE)
40

41

42
def jsonable_encoder(obj: Any, custom_encoder: Optional[Dict[Any, Callable[[Any], Any]]] = None) -> Any:
43
    custom_encoder = custom_encoder or {}
44
    if custom_encoder:
45
        if type(obj) in custom_encoder:
46
            return custom_encoder[type(obj)](obj)
47
        else:
48
            for encoder_type, encoder_instance in custom_encoder.items():
49
                if isinstance(obj, encoder_type):
50
                    return encoder_instance(obj)
51
    if isinstance(obj, pydantic.BaseModel):
52
        encoder = getattr(obj.__config__, "json_encoders", {})
53
        if custom_encoder:
54
            encoder.update(custom_encoder)
55
        obj_dict = obj.dict(by_alias=True)
56
        if "__root__" in obj_dict:
57
            obj_dict = obj_dict["__root__"]
58
        return jsonable_encoder(obj_dict, custom_encoder=encoder)
59
    if dataclasses.is_dataclass(obj):
60
        obj_dict = dataclasses.asdict(obj)
61
        return jsonable_encoder(obj_dict, custom_encoder=custom_encoder)
62
    if isinstance(obj, Enum):
63
        return obj.value
64
    if isinstance(obj, PurePath):
65
        return str(obj)
66
    if isinstance(obj, (str, int, float, type(None))):
67
        return obj
68
    if isinstance(obj, dt.datetime):
69
        return serialize_datetime(obj)
70
    if isinstance(obj, dt.date):
71
        return str(obj)
72
    if isinstance(obj, dict):
73
        encoded_dict = {}
74
        allowed_keys = set(obj.keys())
75
        for key, value in obj.items():
76
            if key in allowed_keys:
77
                encoded_key = jsonable_encoder(key, custom_encoder=custom_encoder)
78
                encoded_value = jsonable_encoder(value, custom_encoder=custom_encoder)
79
                encoded_dict[encoded_key] = encoded_value
80
        return encoded_dict
81
    if isinstance(obj, (list, set, frozenset, GeneratorType, tuple)):
82
        encoded_list = []
83
        for item in obj:
84
            encoded_list.append(jsonable_encoder(item, custom_encoder=custom_encoder))
85
        return encoded_list
86

87
    if type(obj) in pydantic.json.ENCODERS_BY_TYPE:
88
        return pydantic.json.ENCODERS_BY_TYPE[type(obj)](obj)
89
    for encoder, classes_tuple in encoders_by_class_tuples.items():
90
        if isinstance(obj, classes_tuple):
91
            return encoder(obj)
92

93
    try:
94
        data = dict(obj)
95
    except Exception as e:
96
        errors: List[Exception] = []
97
        errors.append(e)
98
        try:
99
            data = vars(obj)
100
        except Exception as e:
101
            errors.append(e)
102
            raise ValueError(errors) from e
103
    return jsonable_encoder(data, custom_encoder=custom_encoder)
104

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.