【问题标题】:Sort/short-circuit getopt flags in pythonpython中的排序/短路getopt标志
【发布时间】:2017-09-11 17:16:06
【问题描述】:

我目前正在扩展一个简单的 命令行应用程序。它目前支持几个命令行参数:

try:
    opts, args = getopt.getopt(sys.argv[1:], 'b:h',
                               ['battle=', 'help'])
except getopt.GetoptError:
    usage()
    raise

# Parse opts/args.
for opt, arg in opts:
    if opt in ('-h', '--help'):
        usage()
    elif opt in ('-b', '--battle'):
        battle = True

我将不得不添加很多额外的命令行参数。我将实现它的方式是,我必须为用户可以设置的每个标志跟踪一个“已设置”标志。

在某些情况下,我想“短路”我的解析器,例如,如果用户同时使用 -x-y-z 标志运行它,以告诉解析器跳过所有剩余的解析操作,只运行一个特定的函数。但是,这会 is x,y,z set 检查每个选项。

  1. 是否有一种“pythonic”方式通过允许我“短路”某些解析操作来简化解析?
  2. 是否可以通过对 opt 和 arg 进行排序来保证我将按特定顺序解析标志/选择?

【问题讨论】:

    标签: python python arguments getopt


    【解决方案1】:

    使用getopt 是硬性要求吗?可以说,更“pythonic”的方法是使用argparse,一个更简单、更高级的模块。在这种情况下,您可以将 argparser 定义为:

    parser = argparse.ArgumentParser()
    parser.add_argument("-x", ...)
    parser.add_argument("-y", ...)
    parser.add_argument("-z", ...)
    
    args = parser.parse_args()
    if args.x and args.y and args.z:
        short_circuit()
    

    对于您的第二个问题,我认为使用 argparse 将无需担心解析顺序,因为您从 args 对象中按名称调用每个 arg。

    【讨论】:

    • 是的,getopt 目前是硬性要求。
    • 这是一个很好的答案。对于我目前的解决方案,杂乱的检查。对于下一个项目,我将使用 argparse。谢谢。
    • 是的,只有getopt 可用,它不会像argparse 那样干净。您可以将每个看到的标志存储在字典中,并在循环结束时进行检查:if all([arg in seen_args for arg in ['x', 'y', 'z']]): short_circuit()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    相关资源
    最近更新 更多