【问题标题】:python 2.7 argparse: How can a mutually exclusive group be created in a normal argument group?python 2.7 argparse:如何在普通参数组中创建互斥组?
【发布时间】:2015-12-17 14:56:41
【问题描述】:

我创建了下一个“父”解析器:

parent_parser = argparse.ArgumentParser(add_help=False)
base_group = parser.add_argument_group(title = "global arguments")                                                     
base_group.add_argument("-l", "--log-file", metavar="FILE", help="set log file (default no log)")                      
base_group.add_argument("-c", "--clear-log", action="store_true", default=False, help="clear log file before logging") 

mutex_group = base_group.add_mutually_exclusive_group()                                                                
mutex_group.add_argument("-v", "--verbose", action="store_true", default=False, help="print logs verbosity")           
mutex_group.add_argument("-q", "--quiet", action="store_true", default=False, help="suppress every normal output") 

如果我在另一个解析器中使用这个解析器作为父解析器,那么我希望在下一个帮助中看到:

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)显示在“可选参数”部分。为什么?它是一个错误吗?还是我做错了什么?

更新:

我为这个问题创建了一个错误:http://bugs.python.org/issue25882。 请参阅此错误了解我的简单代码及其在这种情况下的输出。

【问题讨论】:

  • 互斥参数组未命名,它们始终显示在其父组中(此处为“全局参数”)(例如,参见this中的输出
  • @hlt 但在这种情况下,父组是“base_group”,不是吗?
  • 我想你误会了我:)。我的问题中的输出对我来说是一个很好的解决方案,但事实并非如此。 -v 和 -q 显示在子解析器参数显示的“可选参数”部分。我想如果 -v 和 -q 可以在“全局参数”中看到,父解析器的参数是什么。
  • 它适用于我 2.7.9... 奇数。
  • 我的python版本是2.7.3,也许这是一个错误...我会尝试在python的检查日志中检查它,谢谢检查@hlt

标签: python python-2.7 argparse


【解决方案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' 方法(将组和参数从父级复制到子级的方法)中的 cmets 可以明显看出,开发人员预料到了相互排斥的组嵌入到参数组中的情况,但尚未尝试让它正常工作。

最简单的直接修复方法是跳过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 - 猴子补丁文件的问题。

【讨论】:

    猜你喜欢
    • 2021-12-20
    • 2016-05-04
    • 2011-06-13
    • 2013-05-23
    • 2020-07-29
    • 2011-12-13
    • 2016-05-24
    • 2012-12-04
    相关资源
    最近更新 更多