我想把一个“论据”传递给论证。
即,在以下代码中:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-a")
print parser.parse_args(['-a', 'hi'])
print parser.parse_args(['-a', '-hi'])
输出结果为:
Namespace(a='hi')
usage: problem.py [-h] [-a A]
problem.py: error: argument -a: expected one argument
虽然我希望如此:
Namespace(a='hi')
Namespace(a='-hi')
我怎样才能做到这一点?
我在帮助中看到15.4.4.3. Arguments containing -
部分,但它似乎只支持负数。此外,他们建议传递“ - ”,但它在我的用例中并不好,但在“ - ”之后所有不被视为参数(如果我理解正确的话)。
但是我希望“-a”只消耗1个参数,然后继续将其他参数解析为真正的参数。
怎么做?
在参数起作用之前添加空格:
print parser.parse_args(['-a', ' -hi'])
但有没有办法实现这一点,而无需用户添加空格?
答案 0 :(得分:1)
这是一个解析器子类,它在https://bugs.python.org/issue9334上实现了最新的建议。随意测试它。
class ArgumentParserOpt(ArgumentParser):
def _match_argument(self, action, arg_strings_pattern):
# match the pattern for this action to the arg strings
nargs_pattern = self._get_nargs_pattern(action)
match = _re.match(nargs_pattern, arg_strings_pattern)
# if no match, see if we can emulate optparse and return the
# required number of arguments regardless of their values
#
if match is None:
import numbers
nargs = action.nargs if action.nargs is not None else 1
if isinstance(nargs, numbers.Number) and len(arg_strings_pattern) >= nargs:
return nargs
# raise an exception if we weren't able to find a match
if match is None:
nargs_errors = {
None: _('expected one argument'),
OPTIONAL: _('expected at most one argument'),
ONE_OR_MORE: _('expected at least one argument'),
}
default = ngettext('expected %s argument',
'expected %s arguments',
action.nargs) % action.nargs
msg = nargs_errors.get(action.nargs, default)
raise ArgumentError(action, msg)
# return the number of arguments matched
return len(match.group(1))
当常规参数匹配失败时,它会替换一种提供后退选项的方法。
如果您和您的用户可以使用它,那么长标记修复最好--arg=-a
是最简单的。这明确指定-a
作为--arg
Action的参数。