我刚开始使用attrs
非常漂亮的python模块(或者类似地我们可以使用Python 3.7 DataClasses)。我有一个常见的使用模式是让类成为参数值的容器。我喜欢分配参数时的标签,以及更简洁的属性样式引用值,但我也喜欢在将值存储在有序 dict 之类的东西中时有一些很好的特性:
*
像 atuple
或 a一样解包list
以输入函数参数**
当关键字传递是必要或可取的时解包。
我可以通过在类中添加三个方法来实现这一切
@attr.s
class DataParameters:
A: float = attr.ib()
alpha: float = attr.ib()
c: float = attr.ib()
k: float = attr.ib()
M_s: float = attr.ib()
def keys(self):
return 'A', 'alpha', 'c', 'k', 'M_s'
def __getitem__(self, key):
return getattr(self, key)
def __iter__(self):
return (getattr(self, x) for x in self.keys())
然后我可以使用这样的类:
params = DataParameters(1, 2, 3, 4, 5)
result1 = function1(100, 200, *params, 300)
result2 = function2(x=1, y=2, **params)
这里的动机是数据类提供方便和清晰。但是,我不使用数据类来编写我要编写的模块是有原因的。希望函数调用应该接受简单的参数,而不是复杂的数据类。
上面的代码很好,但我想知道我是否遗漏了一些可以让我完全跳过编写函数的东西,因为模式很清楚。属性按我希望它们解包的顺序添加,并且可以根据关键字参数的属性名称读取为键值对。
也许这是这样的:
@addtupleanddictunpacking
@attr.s
class DataParameters:
A: float = attr.ib()
alpha: float = attr.ib()
c: float = attr.ib()
k: float = attr.ib()
M_s: float = attr.ib()
但我不确定是否有attrs
我没有找到的东西本身可以做到这一点。另外,我不确定如何在添加属性时保持它们的顺序并将其转换为 keys 方法。