【问题标题】:How to dynamically add options to optparser?如何动态添加选项到 optparse?
【发布时间】:2011-10-17 12:26:33
【问题描述】:

我有一个系统,你可以修改,加载哪些模块(并运行;“模块”不一定是python模块,它可以组合几个模块)。该程序可以运行模块 A 和 B。现在,我想要一个选项,每个模块都可以定义(添加)自己的参数。假设 A 想要 -n 而 B 想要 -s 来做某事。但是有一个通用参数-c,是主系统本身需要的。实现这一目标的最佳方法是什么?

到目前为止,我一直在使用单个 optparse.OptionParser 实例,并在初始化时将其传递给每个模块。然后模块可以根据需要修改(添加新参数)。

【问题讨论】:

  • 您目前的做法有什么问题吗?
  • @sth - 当前的解决方案似乎一团糟。首先,我将解析器传递给模块以添加参数。稍后我必须获取参数的值。这是可行的,有点工作。如果有的话,我只是在寻找更优雅的解决方案。

标签: python configuration module code-organization


【解决方案1】:

您应该考虑迁移到支持 sub-parsers 概念的库,例如 argparse(无论如何不推荐使用 optparse),以便每个库都可以创建自己的解析器规则,并且主程序可以将它们组合起来。

【讨论】:

  • 我坚持使用 python 2.6。即使我使用了 argparse,您仍然建议我使用相同的架构,将解析器发送到每个模块(在这种情况下,它将是父解析器)?
  • 子解析器仅在您希望每个模块实现子命令时才有帮助,例如 svn commitsvn checkout 等。如果您只想添加命令行开关子解析器根本没有帮助.
【解决方案2】:

当我遇到这个问题时,我最终使用了一个派生自 ArgumentParser 的类,它增加了注册回调函数的能力,一旦解析了参数就会执行:

import argparse

class ArgumentParser(argparse.ArgumentParser):
   def __init__(self, *p, **kw):
      super(ArgumentParser, self).__init__(*p, **kw)
      self._reactions = []
   def add_reaction(self, handler):
      self._reactions.append(handler)
   def parse_known_args(self, args=None, namespace=None):
      (args, argv) = super(ArgumentParser, self).parse_known_args(args, namespace)
      for reaction in self._reactions:
         reaction(args)
      return (args, argv)

这种方式仍然需要将解析器对象传递给所有模块以注册它们的命令行开关,但模块可以“自行”对开关做出反应:

def arguments_parsed(args):
   if args.datafile:
      load_stuff(args.datafile)

def add_arguments(ap):
   ap.add_argument('--datafile',
         help="Load additional input data")
   ap.add_reaction(arguments_parsed)

这使用argparse,但同样可以使用optparse

它没有使用 subparsers 等高级功能进行测试,可能无法在其中工作,但可以轻松扩展。

【讨论】:

  • 谢谢你的例子,我会调查的。我目前有一个带有我的配置类实例(变量名conf)的模块(conf)。这个配置类有 optparse 对象(变量 optionparser)。所以,我可以很容易地访问它conf.conf.optionparser.add_option(...)。在主要部分开始运行之前,我解析选项以使用它们。这有意义吗?
  • 不管怎样,我会接受你的回答,因为它给了我一些新的想法,回调的想法很有价值。
猜你喜欢
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
  • 2017-01-01
  • 2017-02-04
  • 2021-02-19
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多