【问题标题】:Argparse Positional arguments or DefaultArgparse 位置参数或默认值
【发布时间】:2014-12-07 09:27:04
【问题描述】:

我想像myscript A B C一样运行cli,它应该返回命名空间(my_attribute=['A','B','C'])或myscript,当没有指定参数时,它应该返回默认值,即命名空间(my_attribute=['A', 'B', 'C', 'D'])

这可能吗?

  • nargs='+' 需要至少 1 个命令行参数或引发错误
  • nargs='?'需要 1 或 0 个参数
  • nargs='*' 似乎应该可以工作,但不会生成 add_argument() 中指定的默认列表

我现在有以下内容。

parser.add_argument(
    dest='my_attribute',
    choices=('A', 'B', 'C', 'D'),
    nargs='*',
    default=['A', 'B', 'C', 'D'],
)

**编辑

例如:这可行,但我必须在 A B 之前指定 -attr。我不想使用 -attr

parser.add_argument(
    '-attr',
    dest='my_attribute',
    choices=['A','B', 'C', 'D'],
    nargs='+',
    default=['A','B', 'C', 'D'],

【问题讨论】:

    标签: python argparse


    【解决方案1】:

    你得到什么错误信息?

    当我尝试你的代码时,我得到:

    错误:参数 my_attribute:无效选择:['A'、'B'、'C'、'D'](从 'A'、'B'、'C'、'D' 中选择)

    它正在尝试使用默认值,但它正在根据您的选择测试整个事情。您希望它要么根本不测试默认值,要么单独测试列表中的每个元素。

    没有choices* 位置确实有效。

    正如我在第一个答案中指出的那样,* 位置需要一些特殊处理。 * 可选项没有。

    拼凑是使用default='A'。这通过了选择测试。生成的命名空间将是 Namespace(my_attribute='A')。这不是预期的列表,但在解析后很容易测试和替换。

    parser = argparse.ArgumentParser()
    parser.add_argument(
        dest='my_attribute',
        choices=('A', 'B', 'C', 'D'),
        nargs='*',
        default='A',
    )
    args = parser.parse_args()
    
    if args.my_attribute=='A':
        args.my_attribute=['A', 'B', 'C', 'D']
    print args
    

    有一个关于这个主题的错误报告(几年前):

    http://bugs.python.org/issue9625 'argparse: 使用选项时变量 nargs 的默认值问题'

    有一个提议的补丁将对列表默认值的每个项目执行“选择”测试。有了 argparse 应该可以很好地运行您的示例。但是有大量的 argparse 补丁积压,所以我不希望很快看到这个修复。

    【讨论】:

      【解决方案2】:

      为什么不nargs=4?例如

      parser.add_argument(
          dest='my_attribute',
          choices=list(itertools.permutations(['A', 'B', 'C', 'D']))
          nargs=4,
          default=['A', 'B', 'C', 'D'],
      )
      

      注意选择中的排列,因为您可能需要以下选择:

      'A', 'B', 'C', 'D'
      'A', 'D', 'C', 'B'
      ...
      'D', 'C', 'B', 'A'
      

      如果需要,将 permutations 替换为 combinations

      【讨论】:

      • 我不是必须一直指定 3 个参数吗?我希望能够指定 0 到 4 个 args,当我没有指定任何 args 时返回默认值。
      • 有了这个choices,用法是:usage: PROG [-h] {} {} {} {}
      • 嗯...list(...) ?但无论如何,有太多的选择要展示。如果显示“选择”而不是过滤参数需要选择,我想它们可以在这里省略。
      • choices 对象存在 2 个问题。对于测试,它只需要一个in 测试(例如,choices). For usage argparse 中的'A' 会遍历choices 以组成一个{...} 字符串。
      猜你喜欢
      • 1970-01-01
      • 2017-10-13
      • 2016-08-14
      • 2019-11-20
      • 2022-08-05
      • 2018-01-22
      • 2020-03-15
      • 2015-09-28
      相关资源
      最近更新 更多