Python 3.7 : Utility of Dataclasses and SimpleNameSpace

标签 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)

很多时候我使用 SimpleNamespace 只是为了包装数据并移动它。

我什至将其子类化以添加特殊功能:

from types import SimpleNamespace

class NewSimpleNameSpace(SimpleNamespace):
    def __hash__(self):
        return some_hashing_func(self.__dict__)

对于我的问题:

  1. 人们如何在 SimpleNamespacedataclasses 之间进行选择?
  2. 当扩展 SimpleNamespace 可以达到相同的效果时,为什么它们是必要的?
  3. 所有其他用例 dataclasses 迎合什么?

最佳答案

Dataclasses 更像 namedtuple 和流行的 attrs包而不是 SimpleNamespace (the PEP 中甚至没有提到)。它们有两种不同的预期目的。

数据类

  • 结构化
  • 键入(默认情况下,但可选)
  • 为基本的 dunder 方法(__init____hash____eq__ 等)编写大部分样板文件
  • 为属性的默认值提供简单的机制
  • 可以轻松添加__slots__和方法

简单命名空间

  • “抓包”数据结构
  • 用于您需要的不仅仅是字典但不需要类的地方
  • 不打算使用 __slots__
  • 之类的东西

来自 SimpleNamespace 文档:

SimpleNamespace may be useful as a replacement for class NS: pass. However, for a structured record type use namedtuple() instead.

由于 @dataclass 应该替换 namedtuple 的很多用例,命名记录/结构应该用 @dataclass 来完成,而不是 SimpleNamespace

您可能还想查看 this PyCon talk by Raymond Hettinger ,在那里他进入了 @dataclass 的背景故事以及它的用途。

关于Python 3.7 : Utility of Dataclasses and SimpleNameSpace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51082418/

相关文章:

Python paypalrestsdk 和 SSL 错误

关于 Selenium-Element 的 Python 3.7 帮助无法滚动到 View 中

python - 我无法将字段命名为 "from"

python - 将值赋给与 Python 中变量名相同的字符串

python - Python Struct.Unpack 中的对齐/打包

python - TensorFlow - 返回多维张量的不同子张量

python - 如何在继承的数据类中创建可选字段?

python - C 到 Python : For loop

Python ldap3如何获取组的所有成员

python - 在 Python 数据类中使用描述符作为字段的正确方法是什么?