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'

根据documentation

'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 argumentadd_argument() 中,并在缺少某些内容时优雅地退出。

  • 尽管 add_argument() 有一个 type parameter,但您的情况可能太具体而无法使用它。使用上面的解决方案,filters dict 将包含传递给 --parameter 的参数作为 lists 的 strs。如果你想对传入的参数强制执行特定类型,例如

(3 parameters Int,String,Int)

parse_args() 获取参数后,您需要进行额外的检查。