当我使用Python的argparse或optparse命令行参数解析器时,参数的任何唯一前缀都被视为有效,例如。
$ ./buildall.py --help
usage: buildall.py [-h] [-f]
Build all repositories
optional arguments:
-h, --help show this help message and exit
-f, --force Build dirty repositories
与--help
,--hel
,--he
一起用于帮助选项,--forc
和--fo
用于强制选项。
可以以某种方式关闭此行为吗?我想得到一个不完整参数的错误消息。
答案 0 :(得分:10)
禁用缩写长选项的功能仅在Python 3.5中添加。来自argparse
documentation:
默认情况下,
parse_args()
方法 允许将长选项缩写为前缀,如果缩写是明确的(前缀匹配唯一选项)... 此功能可以通过将 allow_abbrev 设置为False
来停用。
因此,如果您使用的是Python 3.5,则可以使用allow_abbrev=False
创建解析器:
parser = argparse.ArgumentParser(..., allow_abbrev=False)
如果您使用的是optparse或3.5之前的argparse,您只需要使用缩写选项。
答案 1 :(得分:3)
在Python 3.5之前,您必须使用未记录的ArgumentParser
方法进行monkeypatch。实际上不要使用它;它未经测试,可能无法与所有版本(或任何版本)的Python一起使用。仅用于娱乐目的。
import argparse
# This is a copy from argparse.py, with a single change
def _get_option_tuples(self, option_string):
result = []
# option strings starting with two prefix characters are only
# split at the '='
chars = self.prefix_chars
if option_string[0] in chars and option_string[1] in chars:
if '=' in option_string:
option_prefix, explicit_arg = option_string.split('=', 1)
else:
option_prefix = option_string
explicit_arg = None
for option_string in self._option_string_actions:
# === This is the change ===
# if option_string.startswith(option_prefix):
if option_string == option_prefix:
action = self._option_string_actions[option_string]
tup = action, option_string, explicit_arg
result.append(tup)
# single character options can be concatenated with their arguments
# but multiple character options always have to have their argument
# separate
elif option_string[0] in chars and option_string[1] not in chars:
option_prefix = option_string
explicit_arg = None
short_option_prefix = option_string[:2]
short_explicit_arg = option_string[2:]
for option_string in self._option_string_actions:
if option_string == short_option_prefix:
action = self._option_string_actions[option_string]
tup = action, option_string, short_explicit_arg
result.append(tup)
elif option_string.startswith(option_prefix):
action = self._option_string_actions[option_string]
tup = action, option_string, explicit_arg
result.append(tup)
# shouldn't ever get here
else:
self.error(_('unexpected option string: %s') % option_string)
# return the collected option tuples
return result
argparse.ArgumentParser._get_option_tuples = _get_option_tuples
p = argparse.ArgumentParser()
p.add_argument("--foo")
print p.parse_args("--f 5".split())
答案 2 :(得分:2)
对于出于某些原因仍然停留在python2.7上的我们来说,这是对本地禁用前缀匹配的最小更改:
function fibonacci(num, limit) {
let fib = [1,1];
for (let i = num; i <= limit; i++) {
fib.push(fib[i-1] + fib[i-2]);
}
return fib;
}
现在,不要使用argparse.ArgumentParser,而要使用SaneArgumentParser。与chepner的答案不同,这不需要对argparse模块进行任何修改。这也是一个很小的更改。希望其他陷入python过去的人会发现它有用。