xss*_*han 17 python python-3.7 python-dataclasses
Python 3.7提供了dataclasses
具有预定义特殊功能的新功能.
从全局来看,dataclasses
并SimpleNameSpace
都提供了很好的数据封装工厂.
@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)
对于我的问题:
SimpleNameSpace
和dataclasses
?SimpleNameSpace
?dataclasses
迎合什么?简短的回答是,这一切都包含在PEP 557 中。你的问题有点乱...
PEP 很清楚,它们不是替代品,并希望其他解决方案拥有自己的位置。
与任何其他设计决策一样,因此您需要准确确定您关心的功能。如果这包括以下内容,您绝对不想要数据类。
哪些地方不适合使用数据类?
需要与元组或字典的 API 兼容性。需要超出 PEP 484 和 526 提供的类型验证,或者需要值验证或转换。
也就是说,SimpleNameSpace 也是如此,那么我们还能看什么来决定呢?让我们仔细看看数据类提供的额外功能......
SimpleNameSpace 的现有定义如下:
一个简单的对象子类,提供对其命名空间的属性访问,以及一个有意义的代表。
然后 python 文档继续说它提供了一个简单的__init__
,__repr__
和__eq__
实现。与 PEP 557 相比,数据类还为您提供了以下选项:
显然,如果您关心排序或不变性(或需要小众散列控制),您应该使用数据类。
我看不到,尽管您可以争辩说最初的“为什么?” 涵盖其他用例。
数据类更像是namedtuple
和流行的attrs包,而不是SimpleNamespace
(PEP中甚至没有提到)。它们有两个不同的预期目的。
资料类别
__init__
,__hash__
,__eq__
,以及更多)__slots__
和方法SimpleNamespace
__slots__
从SimpleNamespace
文档中:
SimpleNamespace可能会替代
class NS: pass
。但是,对于结构化记录类型,请namedtuple()
改用。
由于@dataclass
应该替换的许多用例namedtuple
,因此应使用而@dataclass
不是命名记录/结构SimpleNamespace
。
您可能还想看一下Raymond Hettinger的这篇PyCon演讲,他在其中谈论了@dataclass
它的背景知识及其用途。