Python Argparse 多次使用同一个参数
Python Argparse use the same argument multiple times
大家好,我正面临一个问题,基本上,我正在使用 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, #(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' - This stores a list, and appends each argument value to the list. This is useful to allow an option to be specified multiple times.
在您的例子中,这将为 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
s 的 str
s。如果你想对传入的参数强制执行特定类型,例如
(3 parameters Int,String,Int)
从 parse_args()
获取参数后,您需要进行额外的检查。
大家好,我正面临一个问题,基本上,我正在使用 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, #(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' - This stores a list, and appends each argument value to the list. This is useful to allow an option to be specified multiple times.
在您的例子中,这将为 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
s 的str
s。如果你想对传入的参数强制执行特定类型,例如
(3 parameters Int,String,Int)
从 parse_args()
获取参数后,您需要进行额外的检查。