我們在使用Python語言進行軟體開發時, 常常會需要dict這個資料結構來儲存複雜結構的資料, 就如同JSON一般, 我們會具有這樣的Key/Value模式組成的資料結構, 如下圖:
而當我們在Python的世界裡, 除了嚴謹規範資料欄位的@dataclass之外, 更常使用的就是「dict」了, 我們會自由寬鬆的使用dict來動態增加特定的Key值與Value值, 如同下方:
mydict = {}
mydict['新的key值'] = '新的value值'
這樣雖然靈活彈性又方便, 但由於沒有預先規範可用的鍵值範圍, 常常會使得後續的維護者無從下手, 假設文檔又不是非常詳盡時, 若原始開發者還在團隊之中當然可以請教沒問題, 但假若原作者已經難以聯繫時, 那麼勢必會帶來極大的負擔, 光是閱讀這些代碼相信就花費不少時間了,更何況是後續的維護與開發呢?
為了減少這樣的狀況發生, 我們在使用Python的Dict時若能帶有一些基本欄位的規範時, 相信後續的維護者就能夠Follow這樣的規範進行修改, 而且也能夠保留原始Dict的彈性,那究竟要怎麼達到這樣的目的呢? 答案就是typing模組裡面的TypedDict。
# 從typing引入TypedDict
from typing import TypedDict
# 使用class FuncParams繼承自TypedDict
class Params(TypedDict):
# 關於a的參數代表的含意...
a: str
# 關於b的參數代表的含意...
b: str
# 關於c的參數代表的含意...
c: str
# 關於d的參數代表的含意...
d: str
# 關於e的參數代表的含意...
e: str
編輯器VSCode則可以根據TypeDict的宣告來提示我們可以使用的Kye值。
我們除了上述提示的Key值可以使用之外, 也可以自行擴充欄位, 但通常不會建議這麼做, 而是應該在原本的class之中加入新的欄位並註解說明, 未來其他開發者進行維護時也會比較容易上手, 減少認知上的錯誤。
# 底下我們新增一個「f」的欄位, 此時可以正常運行不會發生錯誤。
params: Params = {'f': 'f'}
print(params)
靈活彈性的Dict固然方便, 但一個永續發展的系統軟體應該要能夠容易維護, 因此我們如果可以的話, 應該加入一點指引或者規範才能夠讓系統軟體的開發持續發展下去, 也替我們自己減少不必要的麻煩。