gpt4 book ai didi

python - 如何使用 tuple 和 dict 解包但没有额外的方法来制作 attrs 类

转载 作者:太空宇宙 更新时间:2023-11-04 09:40:02 25 4
gpt4 key购买 nike

我刚开始使用 python 的 attrs 模块,它非常灵活(或者类似地,我们可以使用 Python 3.7 DataClasses)。我的一个常见使用模式是让类成为参数值的容器。我喜欢分配参数时的标签,以及更简洁的属性样式引用值,但我也喜欢有一些在将值存储在有序字典中时非常有用的功能:

  1. *tuplelist 一样解包以输入函数参数
  2. ** 在需要或需要关键字传递时解包。

我可以通过向类中添加三个方法来实现这一切

@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 本身是否有我没有找到的东西可以做到这一点。此外,我不确定如何在添加属性时保持属性的顺序并将其转换为键方法。

最佳答案

它没有直接集成到类中,而是the asdictastuple辅助函数旨在执行此类转换。

params = DataParameters(1, 2, 3, 4, 5)
result1 = function1(100, 200, *attr.astuple(params), 300)
result2 = function2(x=1, y=2, **attr.asdict(params))

它们没有集成到类本身中,因为这会使类表现得像一个序列或映射无处不在,当 TypeError/AttributeError 是预期的。在性能方面,这应该没问题;无论如何,解包都会转换为 tuple/dict(它不能传递不是 tupledict 的东西> 直接输入,因为 C API 期望能够在其参数上使用特定于类型的 API。

如果您真的希望该类充当序列或映射,您基本上必须执行您已经完成的操作,尽管您可以使用辅助函数来减少自定义代码和重复的变量名,例如:

@classmethod
def keys(cls):
return attr.fields_dict(cls).keys()

def __getitem__(self, key):
return getattr(self, key)

def __iter__(self):
return iter(attr.astuple(self, recurse=False))

关于python - 如何使用 tuple 和 dict 解包但没有额外的方法来制作 attrs 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52079816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com