如何将 *args 与 argparse 一起使用?
Posted
技术标签:
【中文标题】如何将 *args 与 argparse 一起使用?【英文标题】:How to use *args with argparse? 【发布时间】:2020-11-05 05:34:25 【问题描述】:我正在尝试使用 argparse 模块来解析命令行参数,我想使用 *args 因为参数的数量不固定。
我的代码:
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("program", help='Name of the program')
parser.add_argument("type", help='Type of program')
parser.add_argument("date", help='Date of the file')
这 3 个参数是必须的:程序、类型和日期。但是,下一个参数是可选的(有时需要,有时不需要)。所以,我想使用 *args 作为其他参数,但我不确定使用 argsparse 是如何完成的。
可选参数如下所示:
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("program", help='Name of the program')
parser.add_argument("type", help='Type of program')
parser.add_argument("date", help='Date of the file')
#below arguments are optinal. Hence, I may need to pass all of them in one scenario, or just 1-2 in
another scenario.
parser.add_argument("option1", help='optinal 1')
parser.add_argument("option2", help='optinal 2')
parser.add_argument("option3", help='optinal 3')
parser.add_argument("option4", help='optinal 4')
请帮忙。提前致谢。
【问题讨论】:
这在一般意义上很难回答,您能提供更多上下文吗?你看过例如nargs
?
点头;通常,一个人应该使用nargs='+'
,或者可能需要这些可选参数的(子)命令的子解析器,或者添加您自己的验证逻辑,当它失败时调用解析器的共享打印错误逻辑。我们真的需要一个更详细的问题才能知道正确的答案是什么。
这能回答你的问题吗? Argparse optional positional arguments?
您阅读过任何/大部分 argparse 文档吗?注意到关于positional
参数和optionals
的任何事情吗? optionals/flagged
参数使用类似 --option1
的名称定义,默认为“可选”。
【参考方案1】:
https://docs.python.org/3/library/argparse.html#the-add-argument-method
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
name of flags
是一个 *args
参数;您可以为positional
指定一个名称或为optional
指定多个名称(例如,`('-f','--foo', '--foobar',...)
其他参数以**kwargs
形式接收,因此通常像使用help
参数一样提供。
由于有很多可能的参数,我建议从最简单的开始,并进行实验。
最重要的是https://docs.python.org/3/library/argparse.html#name-or-flags。其次是https://docs.python.org/3/library/argparse.html#nargs。
【讨论】:
我很确定 OP 询问的是命令行参数,而不是函数参数。 @wjandrea,真的。但*args
仅适用于函数参数。但是如果 OP 想要参数是可选的,他必须使用一个或多个文档参数。【参考方案2】:
使用关键字required=bool
parser = argparse.ArgumentParser()
parser.add_argument("-p","--program", help='Name of the program', required=True)
parser.add_argument("-f", "--foo", help='Foo', required=False)
【讨论】:
我认为初学者应该避免使用required
参数。出于某种原因,将诸如您的标记参数称为optionals
。 positionals
的必需值和标记的可选值之间的简单拆分是最少混淆的。选择一个好的default
比设置required=True
更有用。
使用选项是个好主意,但设置required
不是。对于像--foo
这样的选项,required=False
是默认值。同时,没有充分的理由让program
成为选项而不是位置参数。以上是关于如何将 *args 与 argparse 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
如何根据 Python 中的位置参数与 argparse 的组合设置不同的选项?
需要将`-`字符嵌入到python argparse中的参数中