代码之家  ›  专栏  ›  技术社区  ›  aphexlog

是否可以提供两个位置参数的选择,其中必须选择其中一个?

  •  0
  • aphexlog  · 技术社区  · 7 年前

    我需要设置一个位置参数来提供两个可用选项,用户可以输入或使用位置参数 add 还是位置参数 delete

    我希望CLI如何使用此参数的示例: ./myscript.py add --user USERNAME , 或 ./myscript.py delete --user USERNAME , 或 ./myscript.py delete --database DATABASE

    如果我们能以某种方式使这个位置参数成为无需参数,那么就可以获得额外的积分

    另外,我不是想问奖金问题,主要问题。。。这就不那么重要了:)

    谢谢大家

    2 回复  |  直到 7 年前
        1
  •  1
  •   hpaulj    7 年前

    您可以使用 choices 参数并使用“?”将其设置为可选 nargs :

    parser=argparse.ArgumentParser()
    parser.add_argument('foo',choices=['abc','def'],nargs='?')
    parser.add_argument('-d')     # flagged options 
    args = parser.parse_args()
    print(args)
    

    使用多个位置(其中一个为“?”)有点棘手,请参见: Python argparse, Value after positional argument

    要更多地控制这些位置值允许哪些可选,请查看Subparser机制。但首先,试试这个简单的版本。

    使用以下各项进行测试:

    print(parser.parse_args([]))   # no input, ok
    print(parser.parse_args(['-d', '1', 'abc']  # ok
    parser_parse_args(['adf'])  # error
    
        2
  •  0
  •   Borisu    7 年前

    您好,您可以使用相互排斥的组。从官方文件:

    >>> parser = argparse.ArgumentParser(prog='PROG')
    >>> group = parser.add_mutually_exclusive_group()
    >>> group.add_argument('--foo', action='store_true')
    >>> group.add_argument('--bar', action='store_false')
    >>> parser.parse_args(['--foo'])
    Namespace(bar=True, foo=True)
    >>> parser.parse_args(['--bar'])
    Namespace(bar=False, foo=False)
    >>> parser.parse_args(['--foo', '--bar'])
    usage: PROG [-h] [--foo | --bar]
    PROG: error: argument --bar: not allowed with argument --foo