DataClass 是否适合替换字典?

Rag*_*nar 3 python dictionary python-dataclasses

我在代码中经常使用字典作为数据结构。而不是Tuple像 Python 允许的那样返回几个值:

def do_smth():
  [...]
  return val1, val2, val3
Run Code Online (Sandbox Code Playgroud)

我更喜欢使用具有命名键优势的字典。但是对于复杂的嵌套字典,很难在其中导航。几年前我用 JS 编码时,我也喜欢字典,因为我可以像调用子部分一样thing.stuff.foo,IDE 帮助我处理结构。

我刚刚发现了DataClasspython 中的新内容,除了替换字典之外,我不确定这是什么原因?对于我所阅读的内容,DataClass内部无法包含函数,并且其参数的初始化已简化。

我想对此发表评论,你如何使用DataClass, 或关于 python 中的字典。

264*_*4nm 8

数据类更像是 NamedTuples 的替代品,然后是字典。

虽然 NamedTuples 被设计为不可变的,但数据类可以通过frozen=True在装饰器中设置来提供该功能,但总体上提供了更大的灵活性。

如果您喜欢Python 代码中的类型提示,它们就会真正发挥作用。

另一个优点就像你说的 - 复杂的嵌套字典。您可以将数据类定义为您的类型,并以清晰简洁的方式在数据类中表示它们。

考虑以下:

@dataclass
class City:
    code: str
    population: int


@dataclass
class Country:
   code: str
   currency: str
   cities: List[City]


@dataclass
class Locations:
   countries: List[Country]

Run Code Online (Sandbox Code Playgroud)

然后,您可以编写函数,在其中使用数据类名称注释函数参数作为类型提示并访问它的属性(类似于传入字典并访问它的键),或者构造数据类并输出它,即

def get_locations(....) -> Locations:
....
Run Code Online (Sandbox Code Playgroud)

它使代码非常易读,而不是一个庞大的复杂字典。

您还可以设置默认值,这在 NamedTuples 中是不允许的,但在字典中是允许的。

@dataclass
class Stock:
   quantity: int = 0
Run Code Online (Sandbox Code Playgroud)

您还可以控制是否希望在装饰器中对数据类进行排序等,就像是否希望它被冻结一样,而普通字典则不进行排序。浏览此处获取更多信息

如果你想要它们,你会得到对象比较的所有好处,__eq__()例如等等。它们默认也有__init____repr__所以你不必像普通类一样手动输入这些方法。

还有对字段的更多控制,允许元数据等。

最后,您可以通过导入将其转换为字典 from dataclasses import dataclass asdict

  • “而普通字典没有排序”稍微更正,因为 python 3.7 字典确实在您发布之前 2 年前排序:https://gandenberger.org/2018/03/10/ordered-dicts-vs-ordereddict/ (5认同)