`argparse`多项选择论证?
`argparse` multiple choice argument?
我正在使用 argparse
解析 Python 命令行,它应该如下所示:
python script_name.py --sdks=first, second
我的脚本如下所示:
sdk_choises = ['aio','sw']
parser = argparse.ArgumentParser(description='Blah blah')
parser.add_argument('--sdks', action='append', nargs='+', required=True, help='specifies target SDK(s)')
args = parser.parse_args()
if 'aio' in args.sdks:
# do something with aio
if 'sw' in args.sdks:
# do something with sw
当我执行时:
python script_name.py --sdks=aio, sw
我收到错误:
"usage: script.py [-h] --sdks SDKS [SDKS ...]
build.py: error: unrecognized arguments: sw"
我希望能够选择一个或所有选项:
python script_name.py --sdks=first
python script_name.py --sdks=second
python script_name.py --sdks=first, second
我哪里错了?
以下效果不错:
import argparse
parser = argparse.ArgumentParser(description='Blah blah')
parser.add_argument('--sdks', nargs='+', required=True, help='specifies target SDK(s)')
args = parser.parse_args()
print(args.sdks)
传递选项时不需要=
,只需使用:
$ python test.py --sdks ai pw
['ai', 'pw']
如果您更喜欢逗号分隔列表的原始形式,并检查参数是否有效,那么我建议:
parser.add_argument('--sdks', nargs=1, type=lambda s: [sdk_choises[sdk_choises.index(f)] for f in s.split(',')], ...
更简洁的方法是在类似于上述 lambda 的单独函数中定义它:
parser.add_argument('--sdks', nargs=1, type=my_parse_function, ...
argparse 文档提供了带有正确错误报告的解析函数示例。
使用 nargs=1 你需要删除一个额外的列表层。
我正在使用 argparse
解析 Python 命令行,它应该如下所示:
python script_name.py --sdks=first, second
我的脚本如下所示:
sdk_choises = ['aio','sw']
parser = argparse.ArgumentParser(description='Blah blah')
parser.add_argument('--sdks', action='append', nargs='+', required=True, help='specifies target SDK(s)')
args = parser.parse_args()
if 'aio' in args.sdks:
# do something with aio
if 'sw' in args.sdks:
# do something with sw
当我执行时:
python script_name.py --sdks=aio, sw
我收到错误:
"usage: script.py [-h] --sdks SDKS [SDKS ...]
build.py: error: unrecognized arguments: sw"
我希望能够选择一个或所有选项:
python script_name.py --sdks=first
python script_name.py --sdks=second
python script_name.py --sdks=first, second
我哪里错了?
以下效果不错:
import argparse
parser = argparse.ArgumentParser(description='Blah blah')
parser.add_argument('--sdks', nargs='+', required=True, help='specifies target SDK(s)')
args = parser.parse_args()
print(args.sdks)
传递选项时不需要=
,只需使用:
$ python test.py --sdks ai pw
['ai', 'pw']
如果您更喜欢逗号分隔列表的原始形式,并检查参数是否有效,那么我建议:
parser.add_argument('--sdks', nargs=1, type=lambda s: [sdk_choises[sdk_choises.index(f)] for f in s.split(',')], ...
更简洁的方法是在类似于上述 lambda 的单独函数中定义它:
parser.add_argument('--sdks', nargs=1, type=my_parse_function, ...
argparse 文档提供了带有正确错误报告的解析函数示例。 使用 nargs=1 你需要删除一个额外的列表层。