gpt4 book ai didi

python - argparse.REMAINDER 改变位置参数的行为

转载 作者:行者123 更新时间:2023-12-01 03:36:36 32 4
gpt4 key购买 nike

如果没有argparse.REMAINDER,可选参数可以位于位置参数之前或之后:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-a')
parser.add_argument('b')

print(parser.parse_args('-a 1 2'.split())) # Namespace(a='1', b='2')
print(parser.parse_args('2 -a 1'.split())) # Namespace(a='1', b='2')

但是对于argparse.REMAINDER,可选参数必须位于前面:

parser.add_argument('c', nargs=argparse.REMAINDER)

print(parser.parse_args('-a 1 2 3'.split())) # Namespace(a='1', b='2', c=['3'])
print(parser.parse_args('2 -a 1 3'.split())) # Namespace(a=None, b='2', c=['-a', '1', '3'])

使用 argparse.REMAINDER 时如何正确解析最后一行?

最佳答案

要添加到 kabanus 的答案中,了解一些有关如何解析参数的信息可能会有所帮助。

它迭代参数,首先查找位置,然后是可选,然后是位置,...,

在位置步骤中,它会尝试使用 nargs 作为主要因素来匹配尽可能多的内容。默认值是一个字符串(你的“b”); '*' 将匹配下一个可选值(-a);但 REMAINDER 会忽略该约束并匹配到末尾。因此,“位置”评估是贪婪的,而带有 REMAINDER 的评估尤其贪婪。

所以在'2 -a 1 3'情况下,开头的'2'可以匹配'b',其余的可以匹配'c'。只需一次“位置”评估即可消耗整个列表,包括“-a”,然后就完成了。

文档示例显示了这一点:

>>> print(parser.parse_args('--foo B cmd --arg1 XX ZZ'.split()))
Namespace(args=['--arg1', 'XX', 'ZZ'], command='cmd', foo='B')

“--foo”被视为可选,但“--arg1”是 REMAINDER 的一部分。 “args”紧接在“command”之后填充。

如果您想保留对何时使用 REMAINDER 的控制,请将其设为可选 add_argument('-c',nargs='...')。否则你就会受到这个位置/可选循环的支配。

顺便说一句,子解析器是用 narg=argarse.PARSER 实现的,它是“+...”的名称。它类似于 REMAINDER,但至少需要一个字符串(子解析器名称)。它也会消耗其路径上的一切。

您可能希望使用“*”并使用“--”来触发“消耗其他所有内容”操作,而不是 REMAINDER。

关于python - argparse.REMAINDER 改变位置参数的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40280715/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com