【问题标题】:How to use *args with argparse?如何将 *args 与 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 的名称定义,默认为“可选”。

标签: python command-line argparse


【解决方案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 成为选项而不是位置参数。
猜你喜欢
  • 2016-12-15
  • 2014-04-07
  • 2015-03-11
  • 2016-03-05
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
  • 2014-11-25
  • 2015-02-20
相关资源
最近更新 更多