У меня проблемы с использованием attrs / cattrs для преобразования пользовательского класса данных в формат JSON. Мой класс имеет вид:
@attr.s(auto_attribs=True)
class B:
w: Set[datetime] = attr.ib()
x: Set[str] = attr.ib()
y: Set['A'] = attr.ib()
z: Set[Tuple[datetime, str]] = attr.ib(factory=set)
@attr.s(auto_attribs=True, cmp=False)
class A:
a: str = attr.ib()
b: FrozenSet[Team] = attr.ib()
c: FrozenSet[Tuple[datetime, str]] = attr.ib(factory=frozenset)
d: Dict[Tuple[str, str], float] = attr.ib(factory=dict)
Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь преобразовать в dict
через cattrs.unstructure
и наоборот через cattrs.structure
, cattrs показывает ошибку, сообщающую мне, что я должен использовать ловушку:
# Create instance of b
b_instance = B(...)
...
data = cattr.unstructure(b_instance)
print()
print(data)
print()
restored = cattr.structure(data, B)
assert b_instance == restored
ValueError: Unsupported type: <class 'datetime.datetime'>. Register a structure hook for it.
Я зарегистрировал ловушку для преобразования даты и времени в str с заданным форматом:
import cattr
from datetime import datetime
time_format = '%Y-%m-%d %H:%M:%S'
cattr.register_unstructure_hook(datetime, lambda dt: dt.strftime(time_format))
cattr.register_structure_hook(datetime, lambda s, _: datetime.strptime(s, time_format))
но тогда я получаю следующую ошибку TypeError: strptime() argument 1 must be str, not datetime.datetime
.
Мне нужно иметь возможность преобразовать экземпляр объекта в JSON и обратно, используя дату и время в формате %Y-%m-%d %H:%M:%S
, как мне этого добиться?