Watch at Ease看見世界,讀懂生活。

科技 · 實用指南

TOML 提示表格重複宣告?刪除標題前先核對鍵路徑

引號名稱、點分鍵與產生的區段可能在文字不同時仍衝突。保留原檔,核對解析樹,再驗證下一次產生結果。

TOML 鍵路徑原創示意圖
原創示意圖:引號等價與引號內點號會形成不同的路徑判斷。 Watch at Ease

重複表格錯誤指的是語義路徑,不一定是兩行完全相同的文字。刪標題、改鍵名或重跑安裝工具之前,先保留檔案並確認寫入者。

1. 保留確切檔案與寫入者

編輯前複製原始設定。記錄應用程式真正讀取的路徑、解析器或 Python 版本、完整錯誤,以及檔案由人工維護、合併或工具產生。錯誤行通常指出第二次宣告;應向前找已占用同一路徑的宣告,而非立即刪除該行。

檢查輸出時暫停失敗的產生步驟,在筆記中區分工具管理值與使用者自有值。不要將含憑證的完整設定送到線上驗證器;製作去識別的最小重現,保留衝突鍵結構即可。

2. 比較路徑片段,而非標題字串

CPython 3.12.14 樣本中,[service.api] 後接 [service."api"] 會失敗:替同一片段加引號不會建立新表。相反,[service."api.v1"] 與 [service.api.v1] 解析成不同樹狀結構;前者包含字面鍵 api.v1,後者為 api 下再巢狀 v1。因此,改鍵名或移動引號可能改變設定語義,不只是格式。

逐項列出路徑片段及其應有值。不要用文字搜尋把標題內每個點都拆開,引號內的點屬於名稱。空白或等價引號寫法也不是產生工具判斷唯一性的可靠依據。

3. 判斷路徑先前如何定義

同組實驗拒絕 service=1 後接 [service.api],也拒絕 service.api.port=8000 後再寫 [service.api]。行內 service={api={port=8000}} 後嘗試擴充 [service.api] 也失敗。這是值與表格或宣告的衝突,改縮排不能修復語義。

隱含父表不同:先寫含 port 的 [service.api],再寫含 name 的 [service],實驗可以解析。真正重複的 service.api 區段整合為一個保留 port 與 host 的區段,也能解析。先確定由哪個宣告管理表格,保留所有必要值;別自訂後者覆蓋前者的政策,也不要盲刪整段。

4. 驗證解析樹,再測試下次寫入

以應用程式支援的解析器處理候選副本。Python 3.11+ 的 tomllib.load 接受以二進位開啟的檔案,tomllib.loads 接受字串;它檢查 TOML 語法,不檢查應用允許的選項,也不會寫入 TOML。我們的 8 組樣本在 CPython 3.12.14 依 TOML 1.0 執行;Python 3.15 新增 TOML 1.1 支援,應明確區分版本。

核對解析結果的必要鍵路徑、型別與值,再執行應用內建的安全設定檢查。若檔案由工具產生,在可丟棄副本上連續執行兩次,確認兩份輸出皆能解析、使用者值保留且沒有新重複表格,才在備份可用時替換正式檔。下次產生又損壞的人工修補不算完成;應修復寫入工具或使用文件指明的修正版。

TOML 修復驗收流程示意圖
原創示意圖:保留檔案,核對語法與值,再驗證工具兩次寫入。 Watch at Ease