如何有效地在argparse参数中选择一个,两个或三个选项?

时间:2017-09-17 22:48:35

标签: python python-2.7 argparse

我正在设计一个基于argparse的命令行程序,其中一个参数必须要求用户从输出图形格式的总共三个选项中选择一个或多个。如果用户未在命令行中提及此参数,则默认情况下,此参数将输出所有三种类型的输出图。

因此,论证本身或多或少看起来像这样:

import argparse

if __name__ == "__main__":
    BobsProgram = argparse.ArgumentParser(prog= "BobsProgram")
    BobsProgram.description= "This code analyzes these inputs, and will output one or more graphs of your choosing."

    BobsProgram.add_argument("-output_graph", choices= ["pie", "bar", "scatter"], default= all, nargs= "+",
    help= "Unless otherwise indicated, the output graphs will be given in the pie, bar, and scatter forms.")

因此,在我运行args= BobsProgram.parse_args()行并开始发送我的参数之后,我希望它能够设置,以便用户可以按照他们想要的顺序输入他们的选择。我只发现在设置七个条件块时可以使命令行程序起作用:

if args.output_graph == ["pie"]:
    ##format the output file as a pie chart
elif args.output_graph == ["bar"]:
    ##format the output file as a bar chart
elif args.output_graph == ["scatter"]:
    ##format the output as a scatter chart
elif args.output_graph == ["pie","bar"] and ["bar", "pie"]:
    ##format the output as pie and bar charts
elif args.output_graph == ["pie","scatter"] and ["scatter","pie"]:
    ##format the output as pie and scatter charts
elif args.output_graph == ["bar", "scatter"] and ["scatter","bar"]:
    ##format the output as bar and scatter charts
else:
    ##format the output as bar, pie, and scatter charts

最终,尽管代码有效,但它看起来并不是Pythonic,因为我必须在每个条件块中复制很多相同的代码。如何修改它以提高效率?

2 个答案:

答案 0 :(得分:1)

我会做类似的事情:

for arg in args.output_graph:
    if arg == 'pie':
        #add_pie_chart()
    if arg == 'bar':
        #add_bar_chart()
    if arg == 'scatter':
        #add_scatter_plot()

现在只为每个图表调用一次图形功能。只要您的添加图表功能彼此相对较好,即在显示结果之前所有内容都添加到主画布,这应该可以正常工作。

答案 1 :(得分:1)

如果订单无关紧要,那么您可以这样做:

alist = args.your_name
if 'foo' in alist:
   # do foo
elif 'bar' in alist:
   # do bar
# etc

如果用户提供的订单很重要,那么就像这样:

for fn in alist:
    if fn in ['foo']:    # or `fn == 'foo'`
        # do foo
    elif fn in ['bar']:
        # do bar