Argparse:带有可变参数选项的可选参数
Argparse: Optional argument with choices that have variable arguments
我有一个正在尝试改进的 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
尝试传递用引号括起来的多个参数列表,例如:
--create dog "DOG_NAME DOG_BREED"
你也可以用逗号分隔参数,比如
--create dog DOG_NAME,DOG_BREED
使用 split()
获取参数列表。
看起来这对于子解析器可能是可行的,但您也可以尝试使用点击。一个适用于我的系统的例子:
#!/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
我之前实际上对点击并不那么感兴趣 - 我认为它对于我想要的一些复杂案例来说太局限了 - 但它实际上对于这个案例来说非常好。
我有一个正在尝试改进的 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
尝试传递用引号括起来的多个参数列表,例如:
--create dog "DOG_NAME DOG_BREED"
你也可以用逗号分隔参数,比如
--create dog DOG_NAME,DOG_BREED
使用 split()
获取参数列表。
看起来这对于子解析器可能是可行的,但您也可以尝试使用点击。一个适用于我的系统的例子:
#!/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
我之前实际上对点击并不那么感兴趣 - 我认为它对于我想要的一些复杂案例来说太局限了 - 但它实际上对于这个案例来说非常好。