# 將 `optparse` 程式碼遷移到 `argparse`

`argparse` 模組提供了一些高階功能，這些功能在 `optparse` 模組中並未原生提供，包括：

- 處理位置引數。

- 支援子命令。

- 允許替代選項前綴，如 `+` 和 `/`。

- 處理零或多個 (zero-or-more) 和一個或多個 (and one-or-more) 樣式的引數。

- 產生更多資訊的使用訊息。

- 為自訂 `type` 和 `action` 提供了一個更簡單的介面。

最初 `argparse` 模組試圖保持與 `optparse` 的相容性，但在基礎設計上的存在差異 -- 支援宣告式 (declarative) 命令列選項處理 (同時將位置引數處理留給應用程式的程式碼) 和在宣告式介面中支援命名選項 (named options) 和位置引數 -- 代表 API 隨著時間的推移已經與 `optparse` API 分歧。

如 選擇一個命令列參數剖析函式庫 中所述，目前使用 `optparse` 並對其運作方式滿意的應用程式可以繼續使用 `optparse`。

在決定是否遷移之前，應用程式開發人員應該先檢閱該段落中描述的內在行為差異清單，來決定是否值得遷移。

對於選擇從 `optparse` 遷移到 `argparse` 的應用程式，以下建議應會有所幫助：

- 將所有 `optparse.OptionParser.add_option()` 呼叫替換為 `ArgumentParser.add_argument()` 呼叫。

- 將 `(options, args) = parser.parse_args()` 替換為 `args = parser.parse_args()`，並為位置引數新增額外的 `ArgumentParser.add_argument()` 呼叫。請記住，以前稱為 `options` 的東西，在 `argparse` 情境中現在稱為 `args`。

- 使用 `parse_intermixed_args()` 來替換掉 `optparse.OptionParser.disable_interspersed_args()`，而不是使用 `parse_args()`。

- 將回呼動作和 `callback_*` 關鍵字引數替換為 `type` 或 `action` 引數。

- 將 `type` 關鍵字引數的字串名稱替換為相應的類型物件 (例如 int、float、complex 等)。

- 將 `optparse.Values` 替換為 `Namespace`，並將 `optparse.OptionError` 和 `optparse.OptionValueError` 替換為 `ArgumentError`。

- 將隱式引數的字串，如 `%default` 或 `%prog` 替換為使用字典來格式化字串的標準 Python 語法，即 `%(default)s` 和 `%(prog)s`。

- 將 OptionParser 建構函式的 `version` 引數替換為呼叫 `parser.add_argument('--version', action='version', version='<the version>')`。