如何避免使用Dataclass字段作为属性时丢失元数据

发布于 2025-02-08 17:08:31 字数 1038 浏览 2 评论 0原文

我正在尝试使用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文