对于任意字典(最终具有嵌套集合和基本类型),使其成为具有python-attrs的嵌套对象列表的最佳方法是什么?
一些约束:字典键始终是字符串(它们是有效的python标识符),并且它的值将只包含本机集合类型、字符串、整数和浮点数。并且任何全深度的嵌套字典都将始终具有相同的特征。在任何列表或元组中,所有项都将是相同类型或无类型。很可能我的字典将始终是有序映射,因此顺序应该保留在生成的顶级列表和每个嵌套映射中。
例如:
{'some_key': [
{'some_value': 12, 'foo': 'abc', 'bar': [1, 4, 8], 'baz': None}
{'some_value': 24, 'foo': 'xyz', 'bar': [12, 12], 'baz': 'this'}],
'other_key' : [1,2,3,4]
}最后,我想列出两个可以使用属性遍历的对象:
some_key[0].some_value, some_key[0].baz
other_key[-1]也就是说,结果将是将嵌套映射“对象化”。我如何使用attrs做到这一点?使用attr.make_class()调用的一些循环是可行的吗?
发布于 2018-02-07 14:43:05
因此,最终我想出了一个对象化的解决方案,这个解决方案略有不同(并且可以很容易地扩展):
这是在使用attr.make_class。在我的例子中,"pluggy“插件类(pluggy是所使用的插件库,来自py.test)正在向数据object贡献新的data attributes。然后,我调用make_class来构建我的数据类的一个新子类,将新的attr.ib属性添加到这个子类中。我本可以避免声明这些属性,并通过对所贡献属性的数据类型的递归自省来动态构建它们……但我选择了显式而不是隐式;)
在这个过程中,在类主体之外创建的attr.ib可能不会按照我期望的顺序附加到新的子类中,这是一个小问题,@hynek很快就解决了这个问题。
发布于 2020-11-21 00:34:26
我不知道为什么要使用attrs,因为有专门的库:Box
from box import Box
a_dict = {'some_key': [
{'some_value': 12, 'foo': 'abc', 'bar': [1, 4, 8], 'baz': None},
{'some_value': 24, 'foo': 'xyz', 'bar': [12, 12], 'baz': 'this'}],
'other_key': [1, 2, 3, 4]
}
box_dict = Box(a_dict)
assert box_dict.some_key[0].some_value == 12
assert box_dict.some_key[0].baz == None
assert box_dict.other_key[-1] == 4发布于 2018-02-09 04:36:17
这可能有助于说明为什么要使用对象,而不是简单地使用字典。您的示例用法如下:
some_key[0].some_value, some_key[0].baz
other_key[-1]区别在于:
some_key[0]["some_value"], some_key[0]["baz"]
other_key[-1]你在这里唯一想要得到的是点访问语法吗?
attrs旨在为您提供一种更简单地定义类的方法,而不是将非结构化数据包装到非预定义类型的对象中,因此这不像是attrs要解决的用例attrs。
https://stackoverflow.com/questions/48481996
复制相似问题