Argparse:具有可变参数选项的可选参数

时间:2019-11-20 15:39:23

标签: python argparse subparsers

我有一个正在尝试改进的CLI。我想做的是有一个带有3个选择的可选参数,并且根据您的选择,您需要为该选择输入某些参数。

例如:

devise

所以这看起来像是:

--create dog DOG_NAME DOG_BREED OR --create cat CAT_NAME OR --create fish FISH_BREED FISH_TANK

但是对于每个选择,我如何有不同的必需参数?我必须使用子解析器吗?

编辑:使用了略有不同的架构并使其正常工作。

parser.add_argument("--create", help="Create an animal", choices=["dog", "cat", "fish"])

2 个答案:

答案 0 :(得分:2)

子解析器似乎可以做到这一点,但您也可以尝试使用click。在我的系统上工作的示例:

#!/usr/bin/env python3

import click

@click.group('parent')
def parent():
    pass

@parent.group('create')
def create():
    pass

@create.command()
@click.argument('name')
@click.argument('breed')
def dog(name, breed):
    print(f'Dog: {name}: {breed}')

@create.command()
@click.argument('name')
def cat(name):
    print(f'Cat: {name}')

@create.command()
@click.argument('breed')
@click.argument('tank')
def fish(breed, tank):
    print(f'Fish of {breed} in {tank}')

if __name__ == '__main__':
    parent()

运行时:

$ ./click_test.py --help
Usage: click_test.py [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  create

$ ./click_test.py create --help
Usage: click_test.py create [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  cat
  dog
  fish

然后再往下走

$ ./click_test.py create dog
Usage: click_test.py create dog [OPTIONS] NAME BREED
Try "click_test.py create dog --help" for help.

Error: Missing argument "NAME".
$ ./click_test.py create dog Fido Labrador
Dog: Fido: Labrador

以前,我实际上并不对单击感兴趣,我认为对于某些我想要的复杂情况而言,这太过局限了-但对于这种情况,这确实非常好。

答案 1 :(得分:0)

尝试传递包含引号的多个参数列表,例如:

--create dog "DOG_NAME DOG_BREED"

您也可以用逗号分隔参数,例如

--create dog DOG_NAME,DOG_BREED

使用split()获取参数列表。