首页 > 解决方案 > Python Attr:使用其他属性的转换器?

问题描述

Python attrs 中有没有办法让转换器引用自身的属性?现在我正在使用__attr_post_init__,但感觉像是一种罪过。

@attrs
class WindowLayout(object):
    panel_xxyy_boxes = attrib(type=Dict[str, Tuple[int, int, int, int]])
    size = attrib(type=Tuple[int, int], default=None)

    def __attrs_post_init__(self):
        if self.size is None:
            self.size = (max(x for _, x, _, _ in self.panel_xxyy_boxes.values()), max(y for _, _, _, y in self.panel_xxyy_boxes.values()))

标签: python-attrs

解决方案


我认为你的“罪”是基于一种误解。:)

将缺失的参数“转换”为计算值是 attrs 的默认值。

根据您的示例,这样的事情应该可以工作:

@attrs
class WindowLayout(object):
    panel_xxyy_boxes = attrib(type=Dict[str, Tuple[int, int, int, int]])
    size = attrib(type=Tuple[int, int])

    @size.default
    def _size_default(self):
        return (max(x for _, x, _, _ in self.panel_xxyy_boxes.values()), max(y for _, _, _, y in self.panel_xxyy_boxes.values()))

推荐阅读