Python argparse忽略串联的args



我有一个关于Python 2.7中argparse的问题。我试图忽略没有使用的参数,因为我有一个批处理文件,它将参数传递给几个Python脚本,不同的脚本需要提取不同的参数。

例如:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-a', action='store_true')

如果我单独指定每个参数,它会很好地工作:

args, unknown = parser.parse_known_args(['-a',' -b'])
print args
# Namespace(a=True)
print unknown
# [' -b']

但如果我以级联格式指定它们:

args, unknown = parser.parse_known_args(['-ab'])

我得到这个:

: error: argument -a: ignored explicit argument 'b'

然而,如果我在上面的代码中添加这一行:

parser.add_argument('-b', action='store_true')

然后这个工作:

args, unknown = parser.parse_known_args(['-ab'])
print args
# Namespace(a=True, b=True)
print unknown
# []

因此,我似乎只能使用已知参数的串联格式。我想知道是否有一种方法可以使用串联格式,它可以提取它知道的参数?我能想到的唯一替代方案就是定义所有Python脚本中的所有参数,但这似乎会污染-h帮助显示?

我以前从未遇到过这个问题,但我可以想象为什么会发生这种情况。但我必须检查代码以确定细节。

"-ab"被传递给一个名为consume_optional的嵌套函数。它有特殊的代码来识别和吐出这些串联的args。它识别"-a"。由于它不接受任何参数,因此它假定"b"的意思是"-b"。如果未定义"-b",则会发出此错误消息。它不会将其放入extras列表中。

一个独立的"-b"字符串将被放入extras中,但这发生在这个consume_optionals函数的开头。您可能认为"-ab"one_answers"-a-b"是同一回事,但解析路径不同,导致不同的错误。

尝试"-b"的help=argparse.SUPPRESS。这样可以减少帮助显示的"污染"。您可能仍然需要使用自定义的"用法"。

在定义了"-b"但没有定义"-a"的解析器中,"-ab"可能仍然存在问题。整个字符串将被放入"临时"列表中。

最新更新