У меня есть такой класс данных:
@dataclass
class Bla:
arg1: Optional[int] = None
arg2: Optional[str] = None
arg3: Optional[Dict[str, str]] = None
Я хочу это поведение:
>>> bla = Bla(arg1=None, arg2=None, arg3=None)
>>> asdict(bla)
{'arg1': None, 'arg2': None, 'arg3': None}
>>> bla = Bla()
{}
В этом конкретном случае я мог бы использовать dict
, но я бы проигралвозможность иметь подсказки типа (и использовать mypy)
Итак, я попробовал это:
class none:
...
@dataclass
class Bla:
arg1: Union[none, int] = none()
arg2: Union[none, str] = none()
arg3: Union[none, Dict[str, str]] = none()
def __post_init__(self) -> None:
for k, v in self.__dict__.copy().items():
if isinstance(v, none):
delattr(self, k)
Но результат был:
>>> asdict(Bla())
{'arg1': <__main__.none object at 0x7f71bc0159b0>, 'arg2': <__main__.none object at 0x7f71bc015a90>, 'arg3': <__main__.none object at 0x7f71bc015ac8>}
Я ожидал пустойdict
Если попытаться:
>>> a = Bla(None, None, None)
>>> del a.__dict__["arg1"]
>>> asdict(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/(....)/venv/lib/python3.6/site-packages/dataclasses.py", line 1011, in asdict
return _asdict_inner(obj, dict_factory)
File "/home/(...)/venv/lib/python3.6/site-packages/dataclasses.py", line 1018, in _asdict_inner
value = _asdict_inner(getattr(obj, f.name), dict_factory)
AttributeError: 'Bla' object has no attribute 'arg1'
Как я могу динамически удалять атрибуты из объекта класса данных таким образом, чтобы я мог использовать asdict
после этого?