Я хочу создать базовый класс класса данных, в котором все поля в подклассах автоматически становятся Необязательными и по умолчанию имеют значение Нет (если значение по умолчанию не указано).
Следующий код ... кажется, делает то, что я хочу, но не совсем. Это происходит так же, как если бы я никогда не писал __init_subclass__
(т.е. жалуется на незаполненные параметры) ... возможно, потому что мой код запускается после магии класса данных?
@dataclass(order=True, frozen=True)
class BaseDictKey:
def __init_subclass__(cls, *args, **kwargs):
super().__init_subclass__(*args, **kwargs)
# noinspection PyUnresolvedReferences
for field in cls.__dataclass_fields__.values():
field.default = None if field.default is None else field.default
field.type = typing.Union[field.type, NoneType]
@dataclass(order=True, frozen=True)
class ScoreDictKey(BaseDictKey):
catalog: str # magically becomes catalog: Optional[str] = None
dataset: str = 'foo' # magically becomes dataset: Optional[str] = 'foo'
(Если вам интересно, зачем мне это нужно, у меня есть другой базовый класс, который использует эти BaseDictKeys, который ожидает, что все поля в подклассах будут необязательными. Полагаю, я мог бы вместо этого вызвать исключение, если обнаружу что-то не является необязательным, но это кажется более уродливым.)
Возможно ли это в Python 3.7+?
__init_subclass__
(т.е. жалуется на незаполненные параметры) ... возможно, потому что мой код запускается после того, как происходит волшебство класса данных? - person user3534080   schedule 25.10.2019field.default = None if field.default is None else field.default
- person Pynchia   schedule 25.10.2019None if not field.default else field.default
, потому что это не сработает для значений по умолчанию falsy-non-None (0, '', [] и т. Д.) - person user3534080   schedule 25.10.2019