Я не думаю, что можно напрямую вызвать default_factory для явно предоставленных значений None. Но вы можете использовать метод __post_init__
, чтобы явно проверить None и указать значение по умолчанию, особенно если вам нужно проверить много атрибутов.
Вы можете использовать функцию fields
, чтобы автоматически сканировать ваш класс данных 'для значений None
и вызывать default_factory для этих атрибутов, если это было предоставлено:
from dataclasses import dataclass, field, fields, MISSING
from typing import List
@dataclass
class A:
l: List[int] = field(default_factory=list)
def __post_init__(self):
for f in fields(self):
value = getattr(self, f.name)
if value is None and not f.default_factory is MISSING:
setattr(self, f.name, f.default_factory())
s = A([1,2])
print(s.l) # [1,2]
t = A(None)
print(t.l) # []