【问题标题】:Does argparse support multiple exclusive arguments?argparse 是否支持多个独占参数?
【发布时间】:2015-07-07 10:45:04
【问题描述】:

假设我有两组参数。您可以使用每个组中的任意数量的参数,但不能在组之间混合使用参数。

有没有办法自定义argparse 模块中的冲突参数?我试过使用方法add_mutually_exclusive_group,但这不是我想要的。

【问题讨论】:

  • 不,argparse 不支持开箱即用的用例。您必须单独检查。
  • 有没有可以做到这一点的模块?
  • 我不知道,抱歉。
  • @user3056783:我自己没用过,但文档看起来很有希望:Click
  • 请提供一组示例选项来说明为什么add_mutually_exclusive_group 不适合您的需求。我怀疑您正朝着需要子解析器的方向前进

标签: python argparse


【解决方案1】:

我提出了一个补丁(或者更确切地说是补丁),可以让您测试参数的一般逻辑组合。 http://bugs.python.org/issue11588.

我的想法的核心是在parse_args 中添加一个钩子,让用户测试参数的所有逻辑组合。此时它可以访问列表seen 参数。此列表在parse_args 之外对您不可用(因此需要挂钩)。但是通过适当的defaults,您可以编写自己的测试来使用args 命名空间。

实现通用argparse 版本的困难包括:

a) 实现某种嵌套组(在您的情况下,多个 any 组嵌套在 xor 组中)

b) 在有意义的usage 行中显示这些组

目前,您最好的选择是使用子解析器(如果合适的话)实现您的问题,或者在解析后进行自己的测试。并写下你自己的usage

这是一个通用测试的草图,可在解析后应用于args 命名空间

def present(a):
    # test whether an argument is 'present' or not
    # simple case, just check whether it is the default None or not
    if a is not None:
        return True
    else:
        return False

# sample namespace from parser
args = argparse.Namespace(x1='one',x2=None,y1=None,y2=3)

# a nested list defining the argument groups that need to be tested
groups=[[args.x1,args.x2],[args.y1,args.y2]]

# a test that applies 'any' test to the inner group
# and returns the number of groups that are 'present'
[any(present(a) for a in g) for g in groups].count(True)

如果count 为0,则没有找到组,如果1 已找到一个组,等等。我在错误问题中提到的hook 执行相同类型的测试,只是使用了不同的present 测试。

如果计数>1,正常的mutually exclusive 测试会反对。一个必需的组会反对0,等等。你也可以做类似的事情

if (present(args.x1) or present(args.x2)) and 
   (present(args.y1) or present(args.y2)): 
   parser.error('too many groups')

即。 any,all,and,or 的某种组合。但是count 是处理xor 条件的好方法。

【讨论】:

    猜你喜欢
    • 2011-06-13
    • 2020-04-12
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 2011-04-16
    • 1970-01-01
    • 2021-09-28
    相关资源
    最近更新 更多