【问题标题】:Restrict combination of command line arguments限制命令行参数的组合
【发布时间】:2019-10-29 01:00:12
【问题描述】:
我写了一个 python 程序,它接受三个可选的命令行参数。但是我想限制用户输入的 args 组合。它们是:
python script.py -all
python script.py --country_name
python script.py --country_name --city_name
我不应该执行任何其他组合程序。
注意:我使用的是 argparse python 模块
【问题讨论】:
标签:
python
python-3.x
argparse
【解决方案1】:
如果我能看到你的代码可能会更容易......但基本上,一旦你运行:
args = parser.parse_args()
然后您可以将自己的验证放入其中。例如。
if args.all and (args.country_name or args.city_name):
raise MySuitableError
【解决方案2】:
Argparse 有一个mutually exclusive group:
import argparse
def main(parser, args):
if args.country_city is not None:
country, city = args.country_city
print(args)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Hello")
group = parser.add_mutually_exclusive_group()
group.add_argument("-all")
group.add_argument("--country_city", nargs="+")
main(parser, parser.parse_args())
结果:
python3 test.py -all A --country_city a b
usage: test.py [-h]
[-all ALL | --country_city COUNTRY_CITY [COUNTRY_CITY ...]]
test.py: error: argument --country_city: not allowed with argument -all
python3 test.py --country_city a b
Namespace(all=None, country_city=['a', 'b'])
python3 test.py -all A
Namespace(all='A', country_city=None)
【解决方案3】:
我根本不会使用选项,而是可以省略的位置参数。
p = ArgumentParser()
p.add_argument('country', nargs='?')
p.add_argument('city', nargs='?')
然后
script.py # equiv to old script.py --all
script.py FI # equiv to old script.py --countryname FI
script.py FI Turku # equivalent to old script.py --countryname FI --cityname Turku