如何避免使用Dataclass字段作为属性时丢失元数据
我正在尝试使用Dataclass字段作为属性来允许自定义设置器/Getter逻辑,但是当我这样做时,元数据信息似乎会丢失。
考虑以下简单示例突出显示此问题:
from dataclasses import dataclass, field, fields
@dataclass
class Test:
name:str = field(metadata={'persistence': 'DB'})
_name:str = field(init=False, default='name', repr=False)
@property
def name(self):
return self._name
@name.setter
def name(self, value):
self._name = value
print(fields(Test))
输出显示字段名称
的空元数据:
(Field(name='name',type=<class 'str'>,default=<property object at 0x7f15d103d590>,default_factory=<dataclasses._MISSING_TYPE object at 0x7f1617c4dbe0>,init=True,repr=True,hash=None,compare=True,
metadata=mappingproxy({}),_field_type=_FIELD),
Field(name='_name',type=<class 'str'>,default='name',default_factory=<dataclasses._MISSING_TYPE object at 0x7f1617c4dbe0>,init=False,repr=False,hash=None,compare=True,
metadata=mappingproxy({}),_field_type=_FIELD))
如何避免此问题?
I'm trying to use dataclass field as a property to allow custom setter/getter logic, but the metadata information seems to be getting lost when I do so.
Consider the below simple example highlighting this issue:
from dataclasses import dataclass, field, fields
@dataclass
class Test:
name:str = field(metadata={'persistence': 'DB'})
_name:str = field(init=False, default='name', repr=False)
@property
def name(self):
return self._name
@name.setter
def name(self, value):
self._name = value
print(fields(Test))
The output shows empty metadata for the field name
:
(Field(name='name',type=<class 'str'>,default=<property object at 0x7f15d103d590>,default_factory=<dataclasses._MISSING_TYPE object at 0x7f1617c4dbe0>,init=True,repr=True,hash=None,compare=True,
metadata=mappingproxy({}),_field_type=_FIELD),
Field(name='_name',type=<class 'str'>,default='name',default_factory=<dataclasses._MISSING_TYPE object at 0x7f1617c4dbe0>,init=False,repr=False,hash=None,compare=True,
metadata=mappingproxy({}),_field_type=_FIELD))
How can I avoid this issue?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论