15

argparse 在明确的情况下使用默认缩写。

我不想要缩写,我想禁用它。但是在文档中没有找到中没有找到。

可能吗?

例子:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--send', action='store_true')
parser.parse_args(['--se']) # returns Namespace(send=True)

但我希望它仅在提供完整参数时才成立。防止用户出错。

更新:

在 Vikas 回答后,我在 python bugtracker创建了一张票。而且已经处理好了。

4

4 回答 4

10

从 Python 3.5.0 开始,您可以通过使用以下命令启动 ArgumentParser 来禁用缩写:

parser = argparse.ArgumentParser(allow_abbrev=False)

另请参阅文档

于 2015-06-02T04:50:29.633 回答
4

不,显然这是不可能的。至少在 Python 2.7.2 中。

首先,我查看了文档 - 无济于事。

然后我打开了 Lib\argparse.py 并查看了源代码。省略了很多细节,似乎每个参数都由这样的正则表达式解析(argparse:2152):

    # allow one or more arguments
    elif nargs == ONE_OR_MORE:
        nargs_pattern = '(-*A[A-]*)'

此正则表达式将成功解析“-”和“--”,因此我们无法控制短参数和长参数。其他正则表达式也使用 -* 构造,因此它不依赖于参数的类型(无子参数、1 个子参数等)。

稍后在代码中,双破折号被转换为一个破折号(仅适用于非可选参数),同样,用户无需控制任何标志:

    # if this is an optional action, -- is not allowed
    if action.option_strings:
        nargs_pattern = nargs_pattern.replace('-*', '')
        nargs_pattern = nargs_pattern.replace('-', '')
于 2012-05-25T08:31:59.023 回答
4

不,不是没有丑陋的黑客。

@Vladimir 发布的代码片段,我想这不是您想要的。这样做的实际代码是:

def _get_option_tuples(self, option_string):
    ...
    if option_string.startswith(option_prefix):
    ...

看检查是startswith不是==

而且您始终可以扩展argparse.ArgumentParser以提供您自己的_get_option_tuples(self, option_string)来改变这种行为。我只是通过替换两次出现的option_string.startswith(option_prefix)tooption_string == option_prefix和:

>>> parser = my_argparse.MyArgparse
>>> parser = my_argparse.MyArgparse()
>>> parser.add_argument('--send', action='store_true')
_StoreTrueAction(option_strings=['--send'], dest='send', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args(['--se'])
usage: [-h] [--send]
: error: unrecognized arguments: --se

一个警告

该方法_get_option_tuples以 为前缀_,通常表示 python 中的私有方法。覆盖私有也不是一个好主意。

于 2012-05-25T08:53:39.670 回答
4

Python 2.7 的另一种方式。让我们变得笨拙!假设您要识别--dog而不使用缩写。

p = argparse.ArgumentParser()
p.add_argument('--dog')
p.add_argument('--dox', help=argparse.SUPPRESS, metavar='IGNORE')

通过添加第二个参数--dox,该参数与您仅在第三个字母中想要的参数不同,--d并且--do变得模棱两可。因此,解析器将拒绝识别它们。您需要添加代码来捕获生成的异常并根据您调用的上下文对其进行处理parse_args。您可能还需要抑制/调整帮助文本。

help=...参数保留在默认帮助消息的选项列表之外(根据this),metavar='IGNORE'只是为了清楚地表明你真的没有对这个选项做任何事情:)。

于 2016-09-13T21:52:24.740 回答