python
  • argparse
  • 2016-03-31 54 views 1 likes 
    1

    这里是我的解析器配置的款Argparse NARGS =“+”吃位置参数

    parser.add_argument(
        'infile', help="The file to be imported", 
        type=argparse.FileType('r'), default=sys.stdin 
    ) 
    
    parser.add_argument(
        '--carpark', nargs='+', dest='CarparkID', type=int, default=[], 
        help="One or many carpark IDs" 
    ) 
    

    然而,--carpark说法似乎过于贪婪,吃任何它后面:

    $ mycommand --carpark 17 ~/path-to-file 
    mycommand: error: argument --carpark: invalid int value: '/home/oli/path-to-file' 
    

    什么是这样的好方法?我需要传递一个整数ID列表到命令中,但也有一个位置文件(也可以是stdin)。

    是否有 - 例如,一个非贪婪的nargs选项,只会解析这很有意义?

    +0

    请注意,为位置参数指定默认值没什么意义,因为它们不是可选的。 – chepner

    +0

    @chepner我的想法是允许我将事情管理到命令中,而不是做愚蠢的重定向。 – Oli

    回答

    3

    如果要指定多个汽车相提并论的ID,我会做的两件事情,而不是使用nargs='+'之一:

    1. 使用一次,每个ID(mycommand --carpark 17 --carpark 18

      选项
      parser.add_argument('--carpark', 
              dest='carpark_ids', 
              type=int, 
              action='append', 
              default=[], 
              help="One carpark ID (can be used multiple times)" 
      ) 
      
    2. 取而代之以逗号分隔的单个参数(mycommand --carpark 17,18

      parser.add_argument('--carpark', 
              type=lambda s: map(int, s.split(",")), 
              dest='carpark_ids', 
              default=[], 
              help="One or more carpark IDs" 
      ) 
      

      有了更多的工作,您可以修改此选项以允许多次使用--carpark将其所有值累积到一个列表中。

    第三个替代方案,我不是特别喜欢的,就是放弃位置参数,而不是使用可选参数。 (mycommand --carpark 17 18 --infile ~/path-to-file)。

    parser.add_argument('--infile', 
            help="The file to be imported", 
            type=argparse.FileType('r'), 
            default=sys.stdin 
    ) 
    
    parser.add_argument('--carpark', 
            nargs='+', 
            dest='CarparkID', 
            type=int, default=[], 
            help="One or many carpark IDs" 
    ) 
    
    +0

    使用CSV可能是最有意义的,谢谢。 – Oli

    1

    这是行不通的?

    $ mycommand ~/path-to-file --carpark 17 
    

    有超过+操作消耗太多的争论,没有留下用于以下操作Python的错误/问题。

    参数分配基于参数计数,而不是type。分配后应用type函数,并且没有规定返回“被拒绝”的参数。

    在正确的行为中,它应该考虑到infile正在等待一个参数 - 并且没有任何其他标志字符串 - 因此为该Action保留一个字符串。

    我可以看看这个bug /问题,但现在修复是以不同的顺序提供参数。或者定义一个--infile动作(而不是位置)。

    一个较早的问题,与错误/问题链接(我的答案更注重获取usage权利)。

    Argparse - do not catch positional arguments with `nargs`.

    +0

    它确实但它使参数位置。它必须是最后一个。在实践中,实际上有更多的参数比我所说的还有另一个nargs =“+”参数给出了同样的问题。不用说,不可能将两个参数一起使用。 – Oli

    相关问题