【发布时间】:2020-03-23 23:58:54
【问题描述】:
在主函数中,我有一个验证可选输入的解析器:
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()
上面的 sn-p 是一个示例,仅当我提供 --platform 和 --foo,--bar 时才有效或 --baz.
这段代码被不同的组件使用,我们称它们为组件A、B和C。
组件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
我想简化主函数以查看 --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 是什么。有没有更好的办法解决这个问题?
【问题讨论】:
-
你应该看看
argparse'subparsers。 -
有一些关于你想要的行为的问题。 1)您希望每个平台都需要一组特定的可选参数吗? 2)如果你有其他参数为None(如果它们被错误地调用,在命令行中没有错误)可以吗?
-
@Fomalhaut 1) 每个平台的可选参数集在配置 .yaml 文件中定义。每个平台都有自己的一组可选参数,只有在调用函数时指定了某个平台时才应将其添加到解析器中。 2)如果对于某个平台应该有一个错误,例如。在我的示例中,C 指定了 foo。