在我的 Python 腳本中,我有很多命令行參數。其中一些是強制性的,而另一些則是可選的。對於強制參數的某些值,一些可選也是強制的。在這種命令行參數的情況下,最好的方法是什麼。我正在argparse.Argumentparser
為我的目的使用。
為了闡明用例,這裡有一個例子。假設我有 3 個強制參數:mode, foo, bar
和 5 個可選參數:op1, op2, op3, op4, op5
。mode
可以說,可以有 3 個值:m1, m2, m3
. 如果mode
是m1
,則為op1 and op2
必填項。如果mode
是m2
,op3
則是強制性的,如果mode
是m3
,op4 and op5
則是強制性的。
將其放入代碼的最佳方法是什麼?我現在所做的似乎過於詳盡,只是覺得必須有更好的方法來做到這一點。
import argparse
# create and execute parser
my_parser = argparse.ArgumentParser(description="Demo")
my_parser.add_argument("--mode", action="store", type=str, required=True)
my_parser.add_argument("--foo", action="store", type=str, required=True)
my_parser.add_argument("--bar", action="store", type=str, required=True)
my_parser.add_argument("--op1", action="store", type=str, required=False, default=None)
my_parser.add_argument("--op2", action="store", type=str, required=False, default=None)
my_parser.add_argument("--op3", action="store", type=str, required=False, default=None)
my_parser.add_argument("--op4", action="store", type=str, required=False, default=None)
my_parser.add_argument("--op5", action="store", type=str, required=False, default=None)
args = my_parser.parse_args()
try:
if args.mode == "m1":
op1 = args.op1.lower()
op2 = args.op2.lower()
if args.mode == "m2":
op3 = args.op3.split(',')
if args.mode == "m3":
op4 = args.op4.lower()
op5 = args.op5.lower()
except AttributeError:
print("Wrong mode set for optional arguments")
exit()
如您所見,即使這個示例在美學上也只是“看起來”很糟糕(尤其是try
塊解析),並且在我的情況下我有很多可選參數需要處理。任何幫助都感激不盡。
此外,這種方法並沒有完全強制用戶輸入,例如,op1 and op2
如果他的mode=m1
. 如果也有可能做這樣的事情,那對我來說將是額外的好處。
謝謝。
您的程序似乎正在處理多個不同的任務。支持這一點的方法是將您的解析器拆分為子命令:
import argparse
parser = argparse.ArgumentParser(description="Demo")
parser.add_argument("--foo", required=True)
parser.add_argument("--bar", required=True)
subparsers = parser.add_subparsers(dest='mode', required=True)
m1_parser = subparsers.add_parser('m1', help='mode 1')
m1_parser.add_argument("--op1", required=True)
m1_parser.add_argument("--op2", required=True)
m1_parser.add_argument("--op3")
m1_parser.add_argument("--op4")
m1_parser.add_argument("--op5")
m2_parser = subparsers.add_parser('m2', help='mode 2')
m2_parser.add_argument("--op1")
m2_parser.add_argument("--op2")
m2_parser.add_argument("--op3", required=True)
m2_parser.add_argument("--op4")
m2_parser.add_argument("--op5")
m3_parser = subparsers.add_parser('m3', help='mode 3')
m3_parser.add_argument("--op1")
m3_parser.add_argument("--op2")
m3_parser.add_argument("--op3")
m3_parser.add_argument("--op4", required=True)
m3_parser.add_argument("--op5", required=True)
args = parser.parse_args()
if args.mode == 'm1':
print(args.op1) # it will always exist
用法:
$ python3 args.py m1
usage: args.py m1 [-h] --op1 OP1 --op2 OP2 [--op3 OP3] [--op4 OP4] [--op5 OP5]
args.py m1: error: the following arguments are required: --op1, --op2
雖然這似乎是重複的,但您現在可以選擇為特定於子命令的各種選項提供更好的名稱。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句