在optparse中触发默认值的回调

1 投票
2 回答
1457 浏览
提问于 2025-04-17 13:58

我正在使用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"上触发。

2 个回答

0

你可以在调用 parse_args 时加入默认值。

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

因为在参数列表中后面传入的标志会覆盖前面传入的,所以这样做应该是有效的。不过,根据你的回调函数的具体功能,你可能需要调整一下它,以便它能正确处理这个情况。

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 模块的设计让这个问题很难改变。

撰写回答