如何将 *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 参数。出于某种原因,将诸如您的标记参数称为optionalspositionals 的必需值和标记的可选值之间的简单拆分是最少混淆的。选择一个好的default比设置required=True更有用。 使用选项是个好主意,但设置required 不是。对于像--foo 这样的选项,required=False 是默认值。同时,没有充分的理由让program 成为选项而不是位置参数。

以上是关于如何将 *args 与 argparse 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

带有 argparse 的 Python 单元测试

如何根据 Python 中的位置参数与 argparse 的组合设置不同的选项?

需要将`-`字符嵌入到python argparse中的参数中

将 optparse 转换为 argparse

与两个连接的 python3 脚本一起使用时的 argparse 冲突

如何创建 Python 命名空间(argparse.parse_args 值)?