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。它已经处理完毕。
答案 0 :(得分:6)
从Python 3.5.0开始,您可以通过使用以下内容启动ArgumentParser来禁用缩写:
parser = argparse.ArgumentParser(allow_abbrev=False)
答案 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_args
和help=...
变得模棱两可。因此,解析器将拒绝识别它们。您需要添加代码来捕获生成的异常,并根据您调用{1}}的上下文来处理它。您可能还需要抑制/调整帮助文本。
metavar='IGNORE'
将参数保留在默认帮助消息的选项列表之外(Athena),而bad_chars = '“”à'
good_chars = '""a'
只是为了清楚表明你真的没有做任何事情使用此选项:)。