禁用argparse中的缩写

时间:2012-05-25 08:09:21

标签: python argparse

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

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

有可能吗?

示例:

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

但我希望只有在提供完整参数时才会出现这种情况。防止用户错误。

更新

在Vikas回答后我创建了ticket at python bugtracker。它已经处理完毕。

4 个答案:

答案 0 :(得分:6)

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

parser = argparse.ArgumentParser(allow_abbrev=False)

另见the documentation

答案 1 :(得分: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个子参数等)。

稍后在代码中,双短划线转换为一个短划线(仅适用于非可选的args),同样没有任何标志可供用户控制:

    # if this is an optional action, -- is not allowed
    if action.option_strings:
        nargs_pattern = nargs_pattern.replace('-*', '')
        nargs_pattern = nargs_pattern.replace('-', '')

答案 2 :(得分: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)的两个替换为option_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中的私有方法。覆盖私有不是一个好主意。

答案 3 :(得分:3)

Python 2.7的另一种方式。让我们变得笨重!假设您想要在没有缩写的情况下识别--dox

--d

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

metavar='IGNORE'将参数保留在默认帮助消息的选项列表之外(Athena),而bad_chars = '“”à' good_chars = '""a' 只是为了清楚表明你真的没有做任何事情使用此选项:)。