1

如果有一个看起来像这样的 json 数据集。

[
{'a':1,'b':'fire','c':'cambodia','type':'charizard'},
{'a':2,'d':'waterparks','type':'squirtle'},
{'a':3,'f':'thunder','type':'pikachu'}
]

并且需要将其转换为一组对象,其中可以使用相同的类来定义对象。

charizard = Pokemon(row_data)
pickachu = Pokemon(row_data)
squirtle = Pokemon(row_data)

但是属性可以通过点符号访问,就像这样。

charizard.a
pikachu.d
squirtle.a

使用传统课程的方法是这样的。

class Pokemon(object):
    def __init__(self, data):
        for k, v in data.items():
            setattr(self, k, v)

有没有办法对命名元组或数据类或属性做基本相同的事情,适用于不同大小的数据,并具有这些数据类型的所有良好的不变性、repr 等功能。

4

2 回答 2

1

attrs 等人的重点是为您的数据定义明确的类。所以你的问题的简短回答是“不”。

像你想要的那样动态地设置属性不会给你带来太多好处,除了它可以减少输入来访问你的数据。

一种更好的方法是拥有定义明确的类,其中一眼就可以告诉您期望哪些属性并将您的 JSON 序列化/规范化到其中。有一堆包。例如attrs 有cattrs。或者你只是写一个函数或类方法。

你花在明确这个转换上的时间,你会在以后调试时得到十倍的回报。

于 2021-04-17T08:40:17.520 回答
0

将 attrs 用于具有模式的数据。如果您的数据确实有模式(即使它包含大量属性),是的,您可以使用 attrs,甚至可以动态定义数据模式。但是,如果您的数据是无模式的,请不要在其上定义模式。

如果你能举几个真实的例子(至少10个),也许这将有助于我们了解你的确切情况。

于 2021-06-29T06:13:00.413 回答