如何解决Python Argparse多次使用相同的参数
大家好,我遇到了一个问题,所以基本上,我正在使用 Argparse 并希望多次使用相同的参数
--filter
从 dict 列表过滤器和 --parameters
从 --filter
即:
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,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
的参数列表和 parameter
的列表列表(将此参数重命名为 parameters
是有意义的)。>
您必须稍微调整一下代码并添加检查以查看传入的参数数量是否匹配。
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
是否都被指定了,或者使用required
argument在add_argument()
中,如果缺少某些内容,请优雅退出。 -
尽管
add_argument()
有type
parameter,但您的案例可能太具体而无法使用它。使用上述解决方案,filters
dict
将包含作为--parameter
的list
传递给str
的参数。如果您想对传入的参数强制执行特定类型,例如
(3 个参数 Int,String,Int)
从 parse_args()
获取参数后,您需要进行额外的检查。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。