dataclasses.asdict () не работает должным образом - PullRequest
1 голос
/ 14 июня 2019

Я использую dataclass и asdict из dataclasses, и я обнаружил, что asdict не работает так, как я ожидал, когда я ввел наследование.

Я использую dataclasses, чтобы помочь мне создавать словари из классов, чтобы я мог передать их в django.shortcuts.render.

from dataclasses import dataclass
from dataclasses import asdict

@dataclass
class Base:
    name: str

class Test(Base):
    def __init__(self, age, *args, **kwargs):
        self.age = age
        super(Test, self).__init__(*args, **kwargs)

test = Test(age=20, name="john doe")

print(asdict(test))

Я ожидаю, что результат будет

{"age": 20, "name": "john doe"}

Но чтоЯ получаю только ключевое слово-значение из базового класса

{"name": "john doe"}

1 Ответ

2 голосов
/ 14 июня 2019

Правильная реализация для наследования dataclass покрыта в документах :

@dataclass
class Base:
    name: str

@dataclass
class Child(Base):
    age: int

Без этого атрибут __dataclass_fields__ в дочернем классе, который asdict использует для определения того, что должно быть в словаре, не знает обо всех областях, которые вас интересуют;он имеет только унаследованную версию:

>>> Test.__dataclass_fields__
{'name': Field(...)}
>>> Test.__dataclass_fields__ is Base.__dataclass_fields__
True
>>> Child.__dataclass_fields__
{'name': Field(...), 'age': Field(...)}
>>> Child.__dataclass_fields__ is Base.__dataclass_fields__
False

Также обратите внимание, что вы можете упростить импорт до:

from dataclasses import asdict, dataclass
...