我想在內提出一些與我的程序主要功能有關的參數。但是,我有兩個問題:argparse:如何要求一組並非全部相互排斥但不全是可選的參數?
- 不是所有的參數都是互斥的。
- 即使它們全部相互排斥,互斥組 要求參數是可選的,並且主函數
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')
沒有內置argparse。你只需自己寫邏輯 –
謝謝你的簡潔明確的答案。 – GH05T