Argparse nargs =“+”正在吃位置论证

时间:2016-03-31 09:01:25

标签: python argparse

这是我的解析器配置的一个小节

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选项,它只能解析这个有意义的内容吗?

2 个答案:

答案 0 :(得分:4)

如果您想指定多个停车场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将所有值累积到一个列表中。

  3. 第三种选择,我并不特别喜欢,是放弃位置论证,使其成为可选参数。 (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"
    )
    

答案 1 :(得分:1)

这有用吗?

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

+动作上存在Python错误/问题,它消耗了太多参数,没有留下任何后续动作。

参数分配基于参数计数,而不是typetype函数在分配后应用,并且没有规定返回'被拒绝'参数。

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

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

早期的问题,包含错误/问题链接(我的回答更侧重于让usage正确)。

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