[英]Python Argparse use the same argument multiple times
大家好,我遇到了一个问题,所以基本上,我正在使用 Argparse 并希望多次使用相同的参数
--filter
从字典列表过滤器和
--parameters
从--filter
传递所选方法的参数
IE:
python filename.py --filter filtermax \
--parameter hello 2 \
--filter filterPlus \
--parameter 6 "hello 9 \
--filter printer \
--parameter Bye
filters = {
"filtermax": filtermax, #(2 parameters String,Int)
"filtermin": filtermin, #(2 parameters String,Int)
"filterPlus": filterPlus, #(3 parameters Int,String,Int)
"printer": printer, #(1 parameter String)
"printer2": printer2 #(1 Parameter String)
}
parser = argparse.ArgumentParser()
parser.add_argument('--filter',choices=list(filters.keys()))
parser.add_argument('--parameter',nargs='+')
args = parser.parse_args()
filt = args.filter
para = args.parameter
data = filters[filt](*para)
如果我正确理解您的问题,您正在寻找的是add_arguments()
的action='append'
。
根据文档:
'append' - 这会存储一个列表,并将每个参数值附加到列表中。 这对于允许多次指定选项很有用。
在您的情况下,这将为filter
创建一个 arguments 列表和一个参数列表列表(将此parameters
重命名为parameter
是有意义的)。
您必须稍微调整您的代码并添加检查以查看传入的 arguments 的数量是否匹配。
import argparse
filters = {
"filtermax": None,
"filtermin": None,
"filterPlus": None,
"printer": None,
"printer2": None,
}
parser = argparse.ArgumentParser()
parser.add_argument('--filter', choices=filters.keys(), action='append')
parser.add_argument('--parameter', nargs='+', action='append')
args = parser.parse_args()
filt = args.filter
# With `nargs='+'` and `action='append'`
# `args.parameter` becomes a list of lists of strs!
para = args.parameter
if len(filt) != len(para):
raise SystemExit("Number of arguments for filter and parameter don't match!")
# Assuming your intention is to populate the existing `filters` dict:
for fil, par in zip(filt, para):
filters[fil] = par
print(filters)
# With the arguments you've specified, the output will look like:
# {
# 'filtermax': ['hello', '2'],
# 'filtermin': None,
# 'filterPlus': ['6', 'hello', '9'],
# 'printer': ['Bye'],
# 'printer2': None
#}
看起来在您的命令行调用中,有一个不匹配的单双引号,即"hello
。要使其工作(在 bash 中),您需要删除它或匹配它,即hello
或"hello"
。
在生产型环境中,我会添加一些其他检查,例如检查是否同时指定了--parameter
和--filter
,或者在add_argument()
中使用required
的参数,如果缺少某些东西,则优雅地退出。
即使add_argument()
有一个type
参数,您的情况可能太具体而无法使用它。 使用上面的解决方案, filters
dict
将包含 arguments 作为str
的list
传递给--parameter
。 如果您想对传入的参数强制执行特定类型,例如
(3 个参数 Int,String,Int)
从parse_args()
获取 arguments 后,您需要进行额外的检查。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.