如何展平optparse结构?

时间:2012-10-23 07:38:38

标签: python django optparse django-commands

我正在尝试为Django构建一个管理命令,但我遇到了一个问题。似乎option_list变量需要是一个扁平的选项列表。

这是为了简洁而编辑的代码 - 已执行:

def add_options(self, parser):
    group = OptionGroup(parser, "Global Options")
    group.add_option("--logfile", metavar="FILE", \
        help="log file. if omitted stderr will be used")
    ...
    ...
    ...
    group.add_option("-s", "--set", action="append", default=[], metavar="NAME=VALUE", \
        help="set/override setting (may be repeated)")
    parser.add_option_group(group)
    parser.add_option("-t", "--output-format", metavar="FORMAT", default="jsonlines", \
        help="format to use for dumping items with -o (default: %default)")

我需要采用所有选项parser变量,然后将其删除,即删除OptionGroup,同时保留选项并将它们放入新变量中。

Django需要一个类来指定它的选项,以便它可以迭代它。

option_list = (
    make_option('-v', '--verbosity', action='store', dest='verbosity', default='1',
        type='choice', choices=['0', '1', '2', '3'],
        help='Verbosity level; 0=minimal output, 1=normal output, 2=verbose output, 3=very verbose output'),
    make_option('--settings',
        help='The Python path to a settings module, e.g. "myproject.settings.main". If this isn\'t provided, the DJANGO_SETTINGS_MODULE environment variable will be used.'),
    make_option('--pythonpath',
        help='A directory to add to the Python path, e.g. "/home/djangoprojects/myproject".'),
    make_option('--traceback', action='store_true',
        help='Print traceback on exception'),
)

我很失落如何实现这一目标。

2 个答案:

答案 0 :(得分:3)

您可以使用option_list属性获取该选项:

>>> print parser.option_list
[<Option at 0x7f938c8243f8: -h/--help>, <Option at 0x7f938c82b3f8: -t/--output-format>]

不幸的是,这将错过选项组。为此,您必须另外迭代这些组。然后,您可以执行类似(未经测试)的操作:

for group in parser.option_groups:
    option_list += tuple(group.option_list)
option_list += tuple(parser.option_list)

这将失去选项的分组,但如果你需要,你可以摆弄一些东西来实现目标。

简而言之,只需使用option_listoption_groups属性即可。 如何找到自己:使用dir(parser)并寻找最适用的属性;然后这是一个试验和错误。

答案 1 :(得分:0)

你应该可以像这样添加选项:

option_list += (
    make_option("--logfile", metavar="FILE", \
        help="log file. if omitted stderr will be used"),
    make_option("-s", "--set", action="append", default=[], metavar="NAME=VALUE", \
        help="set/override setting (may be repeated)"),
)