Python Argparse多次使用同一参数

2024-09-30 14:25:40 发布

您现在位置:Python中文网/ 问答频道 /正文

大家好,我遇到了一个问题,所以基本上,我正在使用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)

Tags: addparserhello参数stringparameterargsfilter
1条回答
网友
1楼 · 发布于 2024-09-30 14:25:40

如果我正确理解了你的问题,你要找的是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是否都已指定,或者使用add_argument()中的^{} argument,如果缺少某些内容,则正常退出

  • 即使add_argument()有一个^{} parameter,您的案例可能太具体了,无法使用它。使用上面的解决方案filters{}将包含作为strlist传递给 parameter的参数。如果要对传入的参数强制执行特定类型,例如

(3 parameters Int,String,Int)

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

相关问题 更多 >