Python 如何有效地构造argparse参数中一个、两个或三个选项的选择?

Python 如何有效地构造argparse参数中一个、两个或三个选项的选择?,python,python-2.7,argparse,Python,Python 2.7,Argparse,我正在设计一个基于argparse的命令行程序,其中一个必须设置的参数要求用户从总共三个选项中选择一个或多个作为输出图的格式。如果用户在命令行中未提及此参数,则默认情况下,此参数输出所有三种类型的输出图 因此,论点本身看起来或多或少是这样的: import argparse if __name__ == "__main__": BobsProgram = argparse.ArgumentParser(prog= "BobsProgram") BobsProgram.descr

我正在设计一个基于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.")
for fn in alist:
    if fn in ['foo']:    # or `fn == 'foo'`
        # do foo
    elif fn in ['bar']:
        # do bar
因此,在我运行了
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,因为我必须在每个条件块中复制大量相同的代码。我怎样才能修改它以提高效率呢?

我会做一些类似的事情:

for arg in args.output_graph:
    if arg == 'pie':
        #add_pie_chart()
    if arg == 'bar':
        #add_bar_chart()
    if arg == 'scatter':
        #add_scatter_plot()
现在,每个图表只调用一次图形功能。只要您的“添加图表”功能彼此配合得比较好,即在显示结果之前将所有功能都添加到主画布中,此功能就可以正常工作。

我会执行以下操作:

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

现在,每个图表只调用一次图形功能。只要您的“添加图表”功能彼此配合得比较好,即在显示结果之前将所有功能都添加到主画布中,此功能就可以正常工作。

如果顺序无关紧要,则可以执行以下操作:

alist = args.your_name
if 'foo' in alist:
   # do foo
elif 'bar' in alist:
   # do bar
# etc
如果用户提供的订单很重要,那么

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.")
for fn in alist:
    if fn in ['foo']:    # or `fn == 'foo'`
        # do foo
    elif fn in ['bar']:
        # do bar

如果订单不重要,您可以:

alist = args.your_name
if 'foo' in alist:
   # do foo
elif 'bar' in alist:
   # do bar
# etc
如果用户提供的订单很重要,那么

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.")
for fn in alist:
    if fn in ['foo']:    # or `fn == 'foo'`
        # do foo
    elif fn in ['bar']:
        # do bar

不要担心效率。解析器在脚本开始时运行一次。更重要的是,它是用户友好和清晰的。什么是全部?考虑在ARGS.OutPuxGrime</代码>中的“<代码>”栏等测试(因为该属性是这些字符串的列表)。但是,这不会响应用户的命令。@hpaulj
all
是一个关键字,据我所知,它封装了提供的所有选择。另外,测试
'bar'
是什么意思?
all
不是
argparse
关键字。如果将它定义为一个选项列表,它可能会有意义。@hpaulj那么,我应该将
[“饼”、“条”、“散点”]
作为默认值,而不是将
[“饼”、“条”、“散点”]
作为默认值吗?如果您的代码尚未定义
所有=[“饼”、“条”、“散点”]
,那么它会出现一个“名称错误”,'所有'未定义'。不必担心效率。解析器在脚本开始时运行一次。更重要的是,它是用户友好和清晰的。什么是全部?考虑在ARGS.OutPuxGrime</代码>中的“<代码>”栏等测试(因为该属性是这些字符串的列表)。但是,这不会响应用户的命令。@hpaulj
all
是一个关键字,据我所知,它封装了提供的所有选择。另外,测试
'bar'
是什么意思?
all
不是
argparse
关键字。如果将其定义为一个选项列表,它可能会有意义。@hpaulj所以,我应该将
[“饼”、“条”、“散点”]
作为默认值,而不是将
[“饼”、“条”、“散点”]
作为默认值吗?如果您的代码尚未定义
所有=[“饼”、“条”、“散点”]
,它将预期出现一个“名称错误”,即“全部未定义”。