使用其他值转换 python attr.ib

Convert python attr.ib using other values

我正在使用 attrs 库为路径创建数据结构。 我希望第一个属性是其他自动加入的根目录。 我想要这样的东西:

def my_converter(obj, value):
  return os.path.join(obj.root, value)

class Paths:
  root = attr.ib()
  relative = attr.ib(converter=my_converter)

这样就可以了,但是 converter 函数只给出了一个参数。 是否有一种干净的方法可以在验证之前使用其他属性转换值? validator 接受三个参数(其中一个是对象),但它不是转换值的正确位置。将所有内容都放入 __attrs_post_init__ 也违背了使用 attrs 的目的。

您可以使用第三个属性和默认值:

import os
import attr

@attr.s
class Paths:
  root = attr.ib()
  _relative = attr.ib(repr=False)
  full = attr.ib()

  @full.default
  def _full_factory(self):
     return os.path.join(self.root, self._relative)

这给你:

>>> Paths("/home", "foo")
Paths(root='/home', full='/home/foo')

在这种情况下,我个人更喜欢直截了当且命名合理的 @classmethod 工厂方法。它们往往更具可读性,您可以在编写测试时轻松避开它们。