首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python-attrs:子类中的验证器

python-attrs:子类中的验证器
EN

Stack Overflow用户
提问于 2018-02-14 13:22:08
回答 1查看 855关注 0票数 4

使用Python模块attrs,我试图让一个子类对其属性具有比父类更严格的条件,如下面的最小示例所示。

代码语言:javascript
复制
import attr

@attr.s
class Base:
    x = attr.ib()
    y = attr.ib()

@attr.s
class Child(Base):

    @x.validator
    def _x_validator(self, a, x):
        if x < 0:
            raise ValueError()

像上面这样定义一个验证器会引发一个错误(NameError: name 'x' is not defined)。

通过在子类中重新定义x,我找到了一个解决办法。

代码语言:javascript
复制
@attr.s
class Child(Base):
    x = attr.ib()

    @x.validator
    def _x_validator(self, a, x):
        if x < 0:
            raise ValueError()

然而,它扰乱了属性的排序。

代码语言:javascript
复制
In [5]: Child(5, 10)
Out[5]: Child(y=5, x=10)

最后,我重新定义了子类中的所有属性(实际代码中有两个以上)。

有什么更优雅的方法吗?

EN

回答 1

Stack Overflow用户

发布于 2018-03-12 10:40:50

最后,我发现最简单的解决方法就是在子类中不使用验证器:

代码语言:javascript
复制
@attr.s
class Child(Base):
    def __attrs_post_init__(self):
        assert self.x > 0

感谢布鲁诺·德斯特利勒正确地指出了李斯科夫的原则。请注意,这个问题不仅发生在@x.validator上,而且也发生在其他构造上,比如属性默认值@x.default。在这种情况下,即将推出的Python3.7继承的效果稍好一些dataclass似乎要比attrs的要好。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48788285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档