比較選項解析庫
比較選項解析庫
注意:此頁面僅供歷史參考。getopt-sig 已退役,Optik 已於 Python 2.3 中新增到 Python 標準庫(作為 optparse)。(它於 2002 年 11 月提交到 Python 的 CVS 樹,並於 2003 年 7 月首次釋出。)
自從我提議將 Optik 納入 Python 標準庫以來,許多其他選項解析庫也浮出水面。我正嘗試透過使用不同的庫實現相同的實際命令列介面來評估它們。目前,已存在以下實現:
- Greg Ward (也就是我) 的 Optik
- Russ Cox 的迭代器介面 (ArgParser)
- Albert Hofkamp 的 argtools (頁面不再可用)
- David Boddie 的 CMDSyntax (頁面不再可用)
使用者介面
我選擇實現的介面是我的 ripoff CD 抓取指令碼的介面。此介面的主要特點是
- 直接、標準的介面(選項之間沒有複雜的互動)
- 數量可觀(約 17 個)的選項——足夠多,使得某種高階命令列解析幫助非常有用,但又不會多到我需要永遠重新實現該介面多次
- 各種選項型別和操作(用 Optik 的術語來說)(但沒有什麼真正神秘或不尋常的)
- 不接受或不允許位置引數——即,Ripoff 需要知道的一切都可以從命令列選項中獲取。
為了具體起見,這裡是 Ripoff 的幫助文字(由 Optik 生成)。
Ripoff 命令列介面的一個弱點是,一些標誌選項沒有對應的負面選項:例如,有一個 --keep-tmp 選項,但沒有 --no-keep-tmp。這種功能在實際應用中確實是必要的,因為程式的預設設定(本例中為 no-keep-tmp)可能會被配置檔案覆蓋,然後又被命令列再次覆蓋。這個弱點目前體現在我的所有三個測試重新實現中。
內部介面
在內部,Ripoff 透過傳遞一個包含所有命令列值的單一物件來工作。例如,使用者選擇的詳細級別在 options.verbose
中,CD-ROM 裝置檔案在 options.device
中。選項值的數量並不完全等於選項的數量:-v/--verbose 選項和 -q/--quiet 都會更新 options.verbose
,而 -p/--use-pipes 和 -f/--use-files 都會更新 options.use_pipes
標誌。
我在所有測試重新實現中都保留了這一點。這對 Optik 有利(因為它已經將選項值放入一個專用物件中);對迭代器版本影響不大(只是意味著更多的輸入);但它讓 argtools 看起來很糟糕,因為我必須將所有選項值從解析器物件顯式複製到我的專用選項值物件。
現在,女士們,先生們……
廢話少說,好戲開場!首先,關於這三個重新實現的一些簡單統計庫 | 總程式碼量[1] | 程式碼量 (無幫助)[2] |
---|---|---|
Optik | 62 | 34 |
迭代器 | 112 | 73 |
argtools | 108 | 69 |
- 根據 Dinu Gherman 的 pycount 報告——即,這是實際程式碼行數,不包括空行、註釋或文件字串(但包括字面字串,如幫助和使用文字)
- 即,刪除了所有顯式幫助文字。對於 ArgParser 和 argtools,這只是一個大的字面字串,因為這些庫不自動生成幫助。對於 Optik,這只是意味著從每個選項中刪除
help
引數;即使刪除了這種按選項的幫助文字,Optik 仍然提供一個 --help 選項,報告哪些選項可用
但正如馬克·吐溫所說:有謊言,該死的謊言,還有統計資料。所以讓我們來看看程式碼。
- ripoff_optik.py 是使用 Optik 實現的 Ripoff 命令列介面(當然是從 Ripoff 原始碼中直接剪切出來的)
- ripoff_iterator.py 是使用 Russ Cox 的迭代器介面重新實現的版本
- ripoff_argtools.py 是使用 Albert Hofkamp 的 argtools 重新實現的版本
- 由 David Boddie 提供的 CMDSyntax 示例程式碼 (頁面不再可用)
如果您想在不修改任何程式碼的情況下執行這些程式碼,您需要從 Ripoff 的 CVS 倉庫獲取其原始碼。這是因為我需要 1) 一個真實的 --version 選項(它使用 ripoff.__version__
),以及 2) -d/--device 選項的真實幫助(它依賴於 ripoff.cdrom
擴充套件模組,特別是 get_default_device()
函式)。不過,這裡的真正目的是檢查程式碼,而不是執行它。