Python Argparse多次使用相同的参数

如何解决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'

根据documentation

'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 argumentadd_argument() 中,如果缺少某些内容,请优雅退出。

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

(3 个参数 Int,String,Int)

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?