这是我的解析器配置的一个小节
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 :(得分:4)
如果您想指定多个停车场ID,我会做两件事而不是使用nargs='+'
:
每个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)"
)
改为使用单个逗号分隔的参数(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"
)
答案 1 :(得分:1)
这有用吗?
$ mycommand ~/path-to-file --carpark 17
+
动作上存在Python错误/问题,它消耗了太多参数,没有留下任何后续动作。
参数分配基于参数计数,而不是type
。 type
函数在分配后应用,并且没有规定返回'被拒绝'参数。
在正确的行为中,它应该考虑infile
期望一个参数 - 并且没有任何进一步的标志字符串 - 因此为该Action保留一个字符串。
我可以查看bug /问题,但是现在修复是以不同的顺序提供参数。或者定义--infile
动作(而不是位置)。
早期的问题,包含错误/问题链接(我的回答更侧重于让usage
正确)。