簡體   English   中英

Python 3.7:Dataclasses和SimpleNameSpace的實用程序

[英]Python 3.7: Utility of Dataclasses and SimpleNameSpace

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之間SimpleNameSpace選擇?
  2. 為什么它們是必要的,當擴展SimpleNameSpace可以實現相同的效果?
  3. 所有其他用例dataclasses適合什么?

數據類更像是多少namedtuple和流行的attrs包比SimpleNamespace (其中甚至沒有提到的PEP )。 它們有兩種不同的用途。

數據類

  • 結構化的
  • 鍵入(默認情況下,但可選)
  • 寫最樣板的基本dunder方法( __init____hash____eq__ ,等等)
  • 為屬性的默認值提供簡單的機制
  • 可以輕松添加__slots__和方法

SimpleNamespace

  • “抓包”數據結構
  • 用於需要多個字典但少於一個類的地方
  • 不打算用__slots__東西

SimpleNamespace文檔:

SimpleNamespace可以用作class NS: pass的替代class NS: pass 但是,對於結構化記錄類型,請使用namedtuple()

由於@dataclass應該更換了很多的用例namedtuple ,命名為記錄/結構應該與做@dataclass ,不SimpleNamespace

您可能還想看看Raymond Hettinger的這個PyCon演講 ,在那里他進入了@dataclass的背景故事並且它正在使用。

簡短的回答是PEP 557全部涵蓋了這一點。 稍微提問你的問題......

為什么?

  1. 利用PEP 526提供一種定義此類的簡單方法。
  2. 支持靜態類型的檢查器。

如何選擇何時使用它們?

PEP非常清楚它們不是替代品,並期望其他解決方案有自己的位置。

與任何其他設計決策一樣,您需要確切地確定您關心的功能。 如果包含以下內容,您絕對不需要數據類。

哪里不適合使用數據類?

需要API與元組或dicts的兼容性。 需要超出PEP 484和526提供的類型驗證,或者需要進行值驗證或轉換。

也就是說,SimpleNameSpace也是如此,那么我們還能看到什么呢? 讓我們仔細看看數據類提供的額外功能......

SimpleNameSpace的現有定義如下:

一個簡單的對象子類,提供對其命名空間的屬性訪問,以及有意義的repr。

然后python文檔繼續說它提供了一個簡單的__init____init__ __repr____eq__實現。 與PEP 557相比,數據類還為您提供以下選項:

  • 排序 - 按順序比較類,就好像它是字段的元組一樣。
  • 不變性 - 分配給字段將產生異常
  • 控制散列 - 盡管不建議這樣做。

顯然,如果您關心訂購或不可變性(或需要利基散列控制),您應該使用數據類。

其他用例?

沒有我能看到的,雖然你可以說最初的“為什么?” 涵蓋其他用例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM