Python 3.7:Dataclasses和SimpleNameSpace的实用程序

xss*_*han 17 python python-3.7 python-dataclasses

Python 3.7提供了dataclasses具有预定义特殊功能的新功能.

从全局来看,dataclassesSimpleNameSpace都提供了很好的数据封装工厂.

@dataclass
class MyData:
    name:str
    age: int

data_1 = MyData(name = 'JohnDoe' , age = 23)

data_2 = SimpleNameSpace(name = 'JohnDoe' , age = 23)
Run Code Online (Sandbox Code Playgroud)

很多时候我SimpleNameSpace只是用来包装数据并移动它.

我甚至将它子类化为添加特殊功能:

from types import SimpleNameSpace

class NewSimpleNameSpace(SimpleNameSpace):
    def __hash__(self):
        return some_hashing_func(self.__dict__)
Run Code Online (Sandbox Code Playgroud)

对于我的问题:

  1. 有人如何选择SimpleNameSpacedataclasses
  2. 为什么它们是必要的,当扩展时可以达到同样的效果SimpleNameSpace
  3. 所有其他用例dataclasses迎合什么?

Pet*_*ain 5

简短的回答是,这一切都包含在PEP 557 中。你的问题有点乱...

为什么?

  1. 利用 PEP 526 提供定义此类类的简单方法。
  2. 支持静态类型检查器。

如何选择何时使用它们?

PEP 很清楚,它们不是替代品,并希望其他解决方案拥有自己的位置。

与任何其他设计决策一样,因此您需要准确确定您关心的功能。如果这包括以下内容,您绝对不想要数据类。

哪些地方不适合使用数据类?

需要与元组或字典的 API 兼容性。需要超出 PEP 484 和 526 提供的类型验证,或者需要值验证或转换。

也就是说,SimpleNameSpace 也是如此,那么我们还能看什么来决定呢?让我们仔细看看数据类提供的额外功能......

SimpleNameSpace 的现有定义如下:

一个简单的对象子类,提供对其命名空间的属性访问,以及一个有意义的代表。

然后 python 文档继续说它提供了一个简单的__init__,__repr____eq__实现。与 PEP 557 相比,数据类还为您提供了以下选项:

  • ordering - 按顺序比较类,就好像它是其字段的元组一样。
  • 不变性 - 分配给字段会产生异常
  • 控制散列 - 尽管不推荐这样做。

显然,如果您关心排序或不变性(或需要小众散列控制),您应该使用数据类。

其他用例?

我看不到,尽管您可以争辩说最初的“为什么?” 涵盖其他用例。


Edw*_*nix 5

数据类更像是namedtuple和流行的attrs包,而不是SimpleNamespacePEP中甚至没有提到)。它们有两个不同的预期目的。

资料类别

  • 结构化的
  • 输入(默认,但可选)
  • 写最样板的基本dunder方法(__init____hash____eq__,以及更多)
  • 为属性的默认值提供简单的机制
  • 可以轻松添加__slots__和方法

SimpleNamespace

  • “抓袋”数据结构
  • 用于需要多于词典但少于一堂课的地方
  • 不打算使用类似 __slots__

SimpleNamespace文档中:

SimpleNamespace可能会替代class NS: pass。但是,对于结构化记录类型,请namedtuple()改用。

由于@dataclass应该替换的许多用例namedtuple,因此应使用而@dataclass不是命名记录/结构SimpleNamespace

您可能还想看一下Raymond Hettinger的这篇PyCon演讲,他在其中谈论了@dataclass它的背景知识及其用途。