0

我想在​​內提出一些與我的程序主要功能有關的參數。但是,我有兩個問題:argparse:如何要求一組並非全部相互排斥但不全是可選的參數?

  1. 不是所有的參數都是互斥的。
  2. 即使它們全部相互排斥,互斥組 要求參數是可選的,並且主函數search(不要求)使用位置參數。

理想情況下,我認爲'search'是主要功能。因此,我希望它的論點成爲立場;儘管如此,search不需要。但是,至少下列之一是必需的:search, --name, --list, --add, --import, --encrypt, --decrypt, --delete-database, --rename-database, --backup

此外,--name不是互相排斥的選項,它是有點多用:

  • 如果是由自身調用,它的參數(一個數據庫的名字)將被創建,如果它不存在的話。
  • 如果(數據庫)確實存在,它是用來作爲參數傳遞給任何其他選項的功能調用它用:例如,-n myfirstdb --decrypt
  • 然而,如果--name不存在,我認爲最近訪問的數據庫。

目前,我已經運行檢查,這已經開始成爲一種負擔,以查看是否有任何的首要選項已被調用,以測試--name是否不存在一起。

最後,顯然互斥選項不能一起使用。

我怎樣才能讓search成爲這個必需的互斥組的一部分?我怎樣才能讓--name也成爲這個必需的羣體之一,但是它們中的任何一個都不相互排斥?

我正在嘗試使用子分析器,但我不確定它們是否解決了我的問題。任何建議都可能爲我節省幾天的試驗和錯誤,並且非常感謝。

parser.add_argument(
    'search', nargs='*', type=str, metavar='S', help='search [field] for string(s)') 
parser.add_argument(
    '--name', '-n', type=str, help='name of the database; created if does not exist') 

main_ex_group = parser.add_argument_group(
    title='main functions').add_mutually_exclusive_group() 
main_ex_group.add_argument(
    '--list', '-l', action='store_true', help='list databases') 
main_ex_group.add_argument(
    '--add', '-a', action='store_true', help='add new record to database') 
main_ex_group.add_argument(
    '--import','-i', dest='include', metavar='PATH', type=str, 
    help='import file(s) at PATH') 
main_ex_group.add_argument(
    '--encrypt', action='store_true', help='encrypt database') 
main_ex_group.add_argument(
    '--decrypt', action='store_true', help='decrypt database') 
main_ex_group.add_argument(
    '--delete-database', metavar='NAME', type=str, 
    help='delete a database') 
main_ex_group.add_argument(
    '--rename-database', nargs=2, metavar='NAME', type=str, 
    help='rename a database') 
main_ex_group.add_argument(
    '--backup', nargs=2, metavar='NAME DEST', type=str, 
    help='copy database to destination') 


import_group = parser.add_argument_group(title='options for import') 
import_group.add_argument(
    '--parse-fields', action='store_true', 
    help='extract keys/fields from included file(s); used as columns') 
import_group.add_argument(
    '--delimiter', metavar='S', default='::', help='key-value separator') 
+1

沒有內置argparse。你只需自己寫邏輯 –

+0

謝謝你的簡潔明確的答案。 – GH05T

回答

4

​​內部只有兩個分組工具。相互排斥的組和子分析器。 MEG的所有動作都是xor。雖然可能需要組本身,但其所有操作必須是可選的。大多數必須被標記(可選),但可能是一個'可選'的位置(是的,術語可能會混淆)。

沒有嵌套組規定,也沒有規定其他邏輯(和,或任何,不等)。那些已經被要求了,我已經開始了一個補丁,但是它並沒有接近完成。其實測試本身並不難;以一種清晰的方式定義組是非常困難的,正如顯示使用情況一樣。一旦允許嵌套,並嘗試考慮所有邏輯可能性,額外代碼的數量將大幅增加。

現在最好的選擇是在解析完成後進行自己的測試。只要您使用合理的默認值(例如默認默認值None),這並不難。

這裏有一個內部變量'seen_actions',可以很好地用於這個測試,但是我還沒有想出一個簡單的方法來讓像你這樣的程序員可以使用它。我對擴展組的最初想法是創建一個鉤子,它允許您在解析結束時通過訪問此變量來運行您自己的函數。

看一下前面的答案吧。


argument group是一種顯示工具 - 它將幫助行分組。您可以在參數組中嵌套互斥組。這有效地給了MEG一個標題/描述,並將它們的論據一起顯示出來。但是這並不影響usage或測試。而以另一種方式嵌套是沒有意義的。嵌套在MEG中的MEG也是可能的,但最終效果是將所有操作放在一個更大的組中 - 並弄亂使用(請參閱最近的Python bug /問題)。存在的嵌套更像是類繼承的特徵而非設計。


我還想問的人,你會如何表達你的usage線分組中(S)?它的要求很難在usage中表達,它們很難在​​中實施。

+0

我不介意自己做邏輯。我正要做一次重大的改革,現在應該回顧一下我是否可以用'argparse'實現我的目標。感謝您的回覆(即使大部分內容超出了我的理解:)我仍然有一個明確的答案)。 – GH05T

+0

如果我重新訪問問題並提出更具體的修復方法,我會在評論中通知您。 – hpaulj

相關問題