python - Argparse:带有可变参数选项的可选参数

标签 python argparse subparsers

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

例如:

--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"])

但是我如何为每个选择设置不同的必需参数呢?我必须使用子解析器吗?

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

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(title="actions", dest="subcmd")
subp_create = subparsers.add_parser("create", description="Create a Dog, Cat, or Fish")
subp_delete = subparsers.add_parser("delete", description="Delete a Dog, Cat, or Fish")

subp_create.add_argument("--dog", help="Create a Dog", nargs=2, metavar=(DOG_NAME, DOG_BREED))
#etc.

args = parser.parse_args()
handle_args(args)

def handle_args(args):
    if args.subcmd == "create":
        if args.dog:
            dog_name = args.dog[0]
            dog_breed = args.dog[1]
            #Do whatever you need

最佳答案

看起来这对于子解析器可能是可行的,但您也可以尝试使用点击。在我的系统上工作的示例:

#!/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

我之前实际上对点击并不那么感兴趣 - 我认为它对于我想要的一些复杂案例来说太局限了 - 但它实际上对于这个案例来说非常好。

关于python - Argparse:带有可变参数选项的可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58958151/

相关文章:

python - 如何检查特定的子解析器?

python - 在numpy中合并多维数组

python - 将参数传递给 os.system

django - 是否可以在 django 管理命令中创建子解析器?

python - 像 -h 一样对待可选参数

python - argparse 选择允许值的结构

python - 如何使用 argparse 处理 CLI 子命令

python - 调用 CTRL+V 来打开一个窗口

python - 用箭头标记 matplotlib 直方图 bin

python - 这个打印语法是什么? (打印右移)