1

我正在使用 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 的目的。

4

1 回答 1

1

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

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工厂方法。它们往往更具可读性,您可以在编写测试时轻松避开它们。

于 2020-01-28T15:14:26.960 回答