У меня есть этот класс данных в python.
from dataclasses import dataclass
from dataclasses_json import dataclass_json
@dataclass
@dataclass_json
class Test:
published_date: datetime = ""
version: str = ""
И этот словарь
row
{'published_date': '', 'version': 'ver 6'}
Когда я пытаюсь создать класс данных из словаря, я получаю сообщение об ошибке.
Test.from_dict(row)
218 else:
219 tz = datetime.now(timezone.utc).astimezone().tzinfo
--> 220 res = datetime.fromtimestamp(field_value, tz=tz)
221 elif _issubclass_safe(field_type, Decimal):
222 res = (field_value
223 if isinstance(field_value, Decimal)
224 else Decimal(field_value))
TypeError: 'str' object cannot be interpreted as an integer
Мне нужна только часть строки с датой, а не время. Почему я получаю эту ошибку?
Я изменил порядок декораторов, и, как ни странно, теперь он работает.
@dataclass_json
@dataclass
class Test:
published_date: datetime.date = ""
version: str = ""
row = {"published_date": "", "version": ""}
Test.from_dict(row)
Test(published_date='', version='')
row = {"published_date": "2022-05-17", "version": ""}
Test.from_dict(row)
Test(published_date='2022-05-17', version='')
Другой вариант, на который вы могли бы обратить внимание, предполагая, что вам не нужно работать со схемами marshmallow
, — это мастер класса данных. В целом это должно быть немного быстрее - я добавил быстрое сравнение, которое я собрал ниже.
from __future__ import annotations # can be removed in Python 3.10+
import datetime
from dataclasses import dataclass
from timeit import timeit
from dataclass_wizard import JSONWizard
from dataclasses_json import dataclass_json
@dataclass_json
@dataclass
class Test:
published_date: datetime.date = ''
version: str = ''
@dataclass
class TestWiz(JSONWizard):
published_date: datetime.date | str = ''
version: str = ''
n = 1_000
row1 = {"published_date": "", "version": ""}
row2 = {"published_date": "2022-05-17", "version": ""}
tj = timeit('Test.from_dict(row1)', number=n, globals=globals())
tw = timeit('TestWiz.from_dict(row1)', number=n, globals=globals())
print(f'dataclasses-json: {tj:.3f}') # 0.024
print(f'dataclass-wizard: {tw:.3f}') # 0.001
# assert data is the same
assert Test.from_dict(row2).__dict__ == TestWiz.from_dict(row2).__dict__
Спасибо, хороший вариант :)