python 2.7 argparse:如何在普通参数组中创建互斥组?

时间:2015-12-16 10:00:48

标签: python python-2.7 argparse

我创建了下一个"父母"解析器:

usage: my_program.py [-h] [-l FILE] [-c] [-v | -q ] [<the parent arguments ...>]

Desc...

optional arguments:
   <the my_program.py arguments>

global arguments:
  -l FILE, --log-file FILE
                    set log file (default no log)
  -c, --clear-log       clear log file before logging
  -v, --verbose         print logs verbosity
  -q, --quiet           suppress every normal output

如果我将此解析器用作另一个解析器的父级,那么我希望在帮助中看到下一个:

[

但不幸的是,互斥组(-v和-q)的参数显示在&#34;可选参数&#34;部分。为什么?这是一个错误吗?或者我做错了什么?

更新

我为此问题创建了一个错误:http://bugs.python.org/issue25882。 对于我的简单代码及其输出,请参阅此错误。

1 个答案:

答案 0 :(得分:1)

parent_parser可以按照您的意愿行事,但如果用作parents则不会。

如果我添加到您的代码中(更正使用parser):

parent_parser.print_help()

print('-------------')
parser=argparse.ArgumentParser(parents=[parent_parser])
parser.print_help()

我得到(在所有版本中)

1317:~/mypy$ python3.5 stack34308904.py 
usage: stack34308904.py [-l FILE] [-c] [-v | -q]

global arguments:
  -l FILE, --log-file FILE
                        set log file (default no log)
  -c, --clear-log       clear log file before logging
  -v, --verbose         print logs verbosity
  -q, --quiet           suppress every normal output
-------------
usage: stack34308904.py [-h] [-l FILE] [-c] [-v | -q]

optional arguments:
  -h, --help            show this help message and exit
  -v, --verbose         print logs verbosity
  -q, --quiet           suppress every normal output

global arguments:
  -l FILE, --log-file FILE
                        set log file (default no log)
  -c, --clear-log       clear log file before logging

从'_add_container_actions'方法(将组和参数从父级复制到子级)的方法中的注释显而易见,开发人员预测了在argument_group中嵌入了mutual_exclusive_group但尚未尝试过的情况让它正常工作。

最简单的立即修复是跳过parents位,只需在主解析器中定义组和参数即可。 parents在某些情况下是方便的(在其他情况下是令人讨厌的),但很少需要。

现在有一个错误/问题;

暂定修正是添加2行 argparse._ActionsContainer._add_container_actions

....
# add container's mutually exclusive groups
# NOTE: if add_mutually_exclusive_group ever gains title= and
# description= then this code will need to be expanded as above
for group in container._mutually_exclusive_groups:
    #print('container title',group._container.title)
    mutex_group = self.add_mutually_exclusive_group(
        required=group.required)
    # new lines - updates the `_container attribute of the new mx group
    mx_container = title_group_map[group._container.title]
    mutex_group._container = mx_container

http://bugs.python.org/issue25882 - 猴子补丁文件问题。