Argparse nargs="+" 正在吃位置参数
Argparse nargs="+" is eating positional argument
这是我的解析器配置的一部分
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 列表传递到命令中,但也有一个位置文件(也可以是标准输入)。
是否有——例如——一个非贪婪的nargs
选项,它只会尽可能多地解析有意义的内容?
这个有用吗?
$ mycommand ~/path-to-file --carpark 17
有一个 Python bug/issue over +
操作消耗太多参数,留下 none 后续操作。
参数分配基于参数计数,而不是 type
。 type
函数在分配后应用,并且没有返回 'rejected' 个参数的规定。
在正确的行为中,它应该考虑到 infile
需要一个参数——并且没有任何进一步的标志字符串——因此为该操作保留一个字符串。
我可以查看 bug/issue,但目前的解决方法是以不同的顺序提供参数。或者定义一个 --infile
动作(而不是位置)。
一个较早的问题,bug/issue link(我的回答更侧重于让 usage
正确)。
Argparse - do not catch positional arguments with `nargs`.
如果您想指定多个停车场 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
)
def intlist(s):
rv = []
for x in s.split(','):
try:
x = int(x)
except ValueError:
raise ArgumentTypeError("Non-integer carpark id {x}" % (x,))
rv.append(x)
return rv
parser.add_argument('--carpark',
type=intlist,
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"
)
这是我的解析器配置的一部分
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 列表传递到命令中,但也有一个位置文件(也可以是标准输入)。
是否有——例如——一个非贪婪的nargs
选项,它只会尽可能多地解析有意义的内容?
这个有用吗?
$ mycommand ~/path-to-file --carpark 17
有一个 Python bug/issue over +
操作消耗太多参数,留下 none 后续操作。
参数分配基于参数计数,而不是 type
。 type
函数在分配后应用,并且没有返回 'rejected' 个参数的规定。
在正确的行为中,它应该考虑到 infile
需要一个参数——并且没有任何进一步的标志字符串——因此为该操作保留一个字符串。
我可以查看 bug/issue,但目前的解决方法是以不同的顺序提供参数。或者定义一个 --infile
动作(而不是位置)。
一个较早的问题,bug/issue link(我的回答更侧重于让 usage
正确)。
Argparse - do not catch positional arguments with `nargs`.
如果您想指定多个停车场 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
)def intlist(s): rv = [] for x in s.split(','): try: x = int(x) except ValueError: raise ArgumentTypeError("Non-integer carpark id {x}" % (x,)) rv.append(x) return rv parser.add_argument('--carpark', type=intlist, 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"
)