1

我正在使用 Python 的 optparse 来做它最擅长的事情,但是如果没有通过命令行指定其他值,我无法弄清楚如何在默认参数值上触发选项回调;这甚至可能吗?这将使我的代码更干净。

不幸的是,我不能使用 argparse,因为我运行的平台有一个过时的 Python 版本。

编辑: 为了提供更多细节,我添加了一个带有回调和默认值的选项

parser.add_option(
  "-f",
  "--format",
  type = "string",
  action = "callback",
  callback = format_callback,
  default = "a,b,c,d")

回调函数定义如下:

def format_callback(option, opt, value, parser):
  # some processing
  parser.values.V = processed_value

基本上我正在处理"--format"值并将结果放入解析器。这很好用,当"--format"通过命令行直接指定时,但我希望回调也可以在默认"a,b,c,d"值上触发。

4

2 回答 2

3

这根本不可能。

optparse.OptionParser实施parse_args开始于:

def parse_args(self, args=None, values=None):
    """
    parse_args(args : [string] = sys.argv[1:],
               values : Values = None)
    -> (values : Values, args : [string])

    Parse the command-line options found in 'args' (default:
    sys.argv[1:]).  Any errors result in a call to 'error()', which
    by default prints the usage message to stderr and calls
    sys.exit() with an error message.  On success returns a pair
    (values, args) where 'values' is an Values instance (with all
    your option values) and 'args' is the list of arguments left
    over after parsing options.
    """
    rargs = self._get_args(args)
    if values is None:
        values = self.get_default_values()

在处理任何参数之前设置默认值。在解析选项时,实际值会覆盖默认值;当找到相应的参数时调用选项回调。

因此,根本无法为默认值调用回调。模块的设计optparse使得这很难改变。

于 2013-01-28T18:34:47.903 回答
0

您可以在调用时注入默认值parse_args

options, args = parser.parse_args(args=["--option=default"] + sys.argv[1:])

由于参数列表中稍后传递的标志会覆盖之前传递的标志,因此这应该有效。您可能需要修改您的回调函数以根据它在做什么来期望它。

于 2020-02-27T22:24:53.257 回答