使用其他值转换 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
工厂方法。它们往往更具可读性,您可以在编写测试时轻松避开它们。
我正在使用 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
工厂方法。它们往往更具可读性,您可以在编写测试时轻松避开它们。