现在我终于放弃了对Python 2的支持,我正从attrs
迁移到Python 3 dataclasses
,这是我特别努力的一个问题。
比方说,我有一个冻结且可哈希的类MyClass
,其中一个字段my_field
的类型为tuple
。
借助attrs
转换器,我能够提供一种灵活的API,客户端可以使用my_field
,list
或{ {1}}。在创建类之前,它们都会全部自动转换为set
。
我可以使用dict_keys
保留此API吗?
根据要求,提供一个小代码示例:
tuple
答案 0 :(得分:3)
在post_init步骤中通过基类设置属性值似乎可行:
@dataclass(frozen=True)
class MyClass:
my_field: Sequence[str]
def __post_init__(self):
super().__setattr__('my_field', tuple(getattr(self, 'my_field')))
Mixin实现:
class ValidationError(AttributeError):
pass
class ConversionValidationField(Field):
def __init__(self, default=MISSING, default_factory=MISSING, init=True, repr=True,
hash=None, compare=True, metadata=None, converter=None, validator=None):
self.converter = converter
self.validator = validator
super().__init__(default, default_factory, init, repr, hash, compare, metadata)
class ConversionValidationMixin:
def __post_init__(self):
for field in fields(self):
if isinstance(field, ConversionValidationField):
if field.converter:
super().__setattr__(field.name, field.converter(getattr(self, field.name)))
if field.validator:
if not field.validator(getattr(self, field.name)):
raise ValidationError('Validation failed for {}.'.format(field.name))
答案 1 :(得分:1)
不,转换器是PEP选择不实现以保持的数据类很简单的事情之一。 http://www.attrs.org/en/stable/why.html#data-classes提到了更多。
DC严格来说是attrs
的子集,并且它永远不会改变。