![對於需要許多參數的實用程序,建議的介面是什麼?](https://rvso.com/image/122441/%E5%B0%8D%E6%96%BC%E9%9C%80%E8%A6%81%E8%A8%B1%E5%A4%9A%E5%8F%83%E6%95%B8%E7%9A%84%E5%AF%A6%E7%94%A8%E7%A8%8B%E5%BA%8F%EF%BC%8C%E5%BB%BA%E8%AD%B0%E7%9A%84%E4%BB%8B%E9%9D%A2%E6%98%AF%E4%BB%80%E9%BA%BC%EF%BC%9F%20.png)
我正在建立一個命令列實用程序,需要六個資訊才能正常工作。它看起來像這樣:
fm-git filename repository path comment username password
然而,在任何單獨的系統上,username
並且password
將是恆定的。
執行該實用程式時,我發現很難建置。例如,以下是對該實用程式的一次測試呼叫(為了便於閱讀,分為多行):
/Users/chuck/Projects/fm-git/fm-git.py chiv-lib
/Users/chuck/Projects/chiv-lib/ Chivalry/ "continued testing"
Administrator abc1234
我正在考慮透過不同的方式來傳遞這些論點。例如,fm-git -f filename -r repository ...
或fm-git --filename filename --repository repository...
。我還在考慮進行username
和password
參數配置設置,因為它們通常不會改變,然後可以從實用程式呼叫中刪除它們。
當實用程式參數很多但又是必要的時,維持實用程式呼叫可讀性的公認做法是什麼?
答案1
通常,unix 應用程式允許多種方式來提供此訊息,更「具體」的方式會覆蓋不太具體的方式。
所以你有了:
對於圖形應用程序,所使用的工具包幾乎總是提供某種方式來獲取資源(例如
xrdb
普通 X 中的 -style 等)設定檔(如果工具包尚未提供)。
命令列選項,包括短格式和長格式(
getopt
在 C 中很容易使用)如果沒有給予訊息,則合理的預設值,例如路徑的當前目錄
位置參數僅對少數強制參數有意義,後面可能是檔案清單(因為通配符規範擴展到多個參數)。六件單獨的作品太多了;該順序很難記住,因此請使用這些選項。
對於密碼,提供一種使應用程式從 stdin 讀取密碼的方法可能會有所幫助,可能透過使用特殊值(例如--password -
或-p -
)。
使用該應用程式的任何人都可以選擇硬編碼密碼、設定檔中的密碼或讓使用者輸入密碼是否是特定用例的最佳選擇。
答案2
一般來說,最好:
- 計算依賴參數,但允許重新定義它們:例如,在您的範例中,您具有
filename
與 相同的參數$(basename repository)
,因此您可能只需要儲存庫,但可以選擇--filename
提供替代檔案名稱。 - 從命令列和
ps
輸出中隱藏身份驗證。將它們放在某個文件中:可能是$HOME/.fm-git.conf
,給予文件更多限制,例如chmod 600 $HOME/.fm-git.conf
從文件中讀取它們。有時,它也可以從環境變數中取得使用者名稱和密碼(例如預設使用者名稱是您的系統使用者名稱或SUDO_USER
),但可能不是您的情況。
因此,經過兩次優化後,您只有 3 個 cli 參數,我認為這是可以接受的。隨意使用它們作為位置參數或提供一些標誌,例如--comment
:如果您進一步在腳本中使用程序,提供長標誌將增強可讀性,但如果您主要從 cli 手動運行程序,則需要輸入更多內容。
無論如何,當你用 Python 寫程式時,我建議你使用argparse模組-- 它將幫助您解析參數並在將來如果您想更改它們時進行更改。