【问题标题】:python argparse - passing "argument" to argument [duplicate]python argparse - 将“参数”传递给参数[重复]
【发布时间】:2018-06-27 15:00:36
【问题描述】:

我想向参数传递一个“参数”。

即,在以下代码中:

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'])

但是有没有办法实现这一点,而不需要用户添加空格?

【问题讨论】:

  • 我想不出任何需要以 - 为前缀的参数值的用例。为什么不直接传入hi 并在使用参数时添加破折号?
  • 这个脚本是一个编译包装器,它调用另一个编译脚本。它需要允许用户按原样将参数传递给“低级”编译脚本。包装器不熟悉底层脚本的所有参数,不知道是否以及何时需要破折号
  • 经过一番研究,我没有找到按照你说的做的方法,这似乎是 argparse 的固有限制。 7 年前就有过讨论,但似乎没有取得任何进展,一些标准模块被废弃了。最好的解决方法似乎是使用=,比如parse_args(['-a=-hi'])
  • optparse 是(并将保持)可用作替代解析器。和旧的 getopt 一样。

标签: python argparse


【解决方案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 操作的参数。

【讨论】:

    猜你喜欢
    • 2016-09-08
    • 2018-10-17
    • 2018-03-07
    • 2013-11-30
    • 2017-10-10
    • 2018-02-25
    • 2021-10-20
    • 2018-11-19
    • 2011-11-12
    相关资源
    最近更新 更多