gpt4 book ai didi

基于另一个参数将参数添加到 argparse 的 Pythonic 方法

转载 作者:太空宇宙 更新时间:2023-11-03 23:51:54 27 4
gpt4 key购买 nike

在主函数中,我有一个验证可选输入的解析器:

def main():
parser = argparse.ArgumentParser()
parser.add_argument('--platform',required=True)
parser.add_argument('--foo')
parser.add_argument('--bar')
parser.add_argument('--baz')
parser.parse_args()

上面的代码片段是一个示例,它仅在我提供 --platform--foo--bar 或 < em>--baz.

此代码由不同的组件使用,我们称它们为组件ABC

组件 A 实际上只指定了 --foo--bar:

python script.py --platform A --foo first_example --bar first_example

组件 B 实际上只指定了 --bar--baz:

python script.py --platform B --bar second_example --baz second_exmaple

组件C实际上只指定了--baz:

python script.py --platform C --baz third_example

随着我引入更多提供不同参数的组件,我必须添加到解析器的参数数量也会增加。以上只是一个例子,我目前正在处理 20 个左右的参数(将来可能会更多)。

我一直在考虑拥有一个配置文件 (.yaml),我在其中定义每个组件需要哪些参数:

# parameters.yaml
A:
- foo
- bar

B:
- bar
- baz

C:
- baz

我想简化 main 函数以查看 --platform 参数,并根据作为参数传递的平台读取配置并向解析器添加其他参数。

这是我尝试过的:

def main():
parser = argparse.ArgumentParser()
parser.add_argument('--platform',required=True)

# Read from .yaml file
with open('parameters.yaml') as parameter_file:
parameters = yaml.safe_load(parameter_file)

for argument in parameters[sys.argv[sys.argv.index('--platform') + 1]]:
parser.add_argument(
'--' + argument
)

parser.parse_args()

调用函数:

python script.py --platform C --baz third_example

上面的代码有效,但我正在寻找其他 Pythonic 解决方案,因为我是 Python 的初学者。我不太喜欢必须查看 sys.argv 才能确定已指定的--platform。这个问题有更好的解决方案吗?

最佳答案

将子解析器作为子命令:

import argparse

def run_command(parser, args):
if args.command == 'A':
print(args)
elif args.command == 'B':
print(args)
elif args.command == 'C':
print(args)

parser = argparse.ArgumentParser(
prog='PROG',
epilog="See '<command> --help' to read about a specific sub-command."
)
subparsers = parser.add_subparsers(dest='command', help='Sub-commands')

A_parser = subparsers.add_parser('A', help='Platform A')
A_parser.add_argument("--foo")
A_parser.add_argument('--bar')
A_parser.set_defaults(func=run_command)

B_parser = subparsers.add_parser('B', help='Platform B')
B_parser.add_argument('--bar')
B_parser.add_argument('--baz')
B_parser.set_defaults(func=run_command)

C_parser = subparsers.add_parser('C', help='Platform C')
C_parser.add_argument('--baz')
C_parser.set_defaults(func=run_command)

args = parser.parse_args()
if args.command is not None:
args.func(parser, args)
else:
parser.print_help()

这会产生:

~ python args.py -h
usage: PROG [-h] {A,B,C} ...

positional arguments:
{A,B,C} Sub-commands
A Platform A
B Platform B
C Platform C

optional arguments:
-h, --help show this help message and exit

See '<command> --help' to read about a specific sub-command.

~ python args.py B -h
usage: PROG B [-h] [--bar BAR] [--baz BAZ]

optional arguments:
-h, --help show this help message and exit
--bar BAR
--baz BAZ

关于基于另一个参数将参数添加到 argparse 的 Pythonic 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59086966/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com