繁体   English   中英

Python Argparse 多次使用相同的参数

[英]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 作为strlist传递给--parameter 如果您想对传入的参数强制执行特定类型,例如

(3 个参数 Int,String,Int)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM