【问题标题】:argparse: Emulating GCC's "-fno-<option>" semanticsargparse:模拟 GCC 的“-fno-<option>”语义
【发布时间】:2016-10-20 00:48:28
【问题描述】:

GCC 命令行解析的一个很好的特性是大多数“-fmy-option”形式的标志都有一个名为“-fno-my-option”的否定版本。最右边的事件优先,因此您只需将“-fno-my-option”附加到您的 CFLAGS 或 Makefile 中的类似内容即可禁用选项而不会破坏其他标志。

我想在包装脚本是 Python 并使用 argparse 的工具中支持类似的东西。仅使用 store_true 操作定义参数的两个版本的明显技巧是行不通的,因为这不会让我要求最右边的出现。

显然,支持--my-option=yes / --my-option=no 之类的语法很容易,但用户不必传递参数会很好。

有没有办法让 argparse 为这样的布尔标志设置一个开/关开关?

【问题讨论】:

    标签: python command-line-arguments argparse


    【解决方案1】:

    无需任何花哨的工作,我就可以设置一对写入同一 dest 的参数,并利用最后一次写入的事实:

    In [765]: parser=argparse.ArgumentParser()
    In [766]: a1=parser.add_argument('-y',action='store_true')
    In [767]: a2=parser.add_argument('-n',action='store_false')
    

    如果没有dest 参数,它们会使用从选项字符串中提取出来的名称。但我可以提供dest,或者在创建后更改该值:

    In [768]: a1.dest
    Out[768]: 'y'
    In [769]: a2.dest
    Out[769]: 'n'
    In [770]: a1.dest='switch'
    In [771]: a2.dest='switch'
    

    现在使用任何一个都将设置switch 属性。

    In [772]: parser.parse_args([])
    Out[772]: Namespace(switch=False)
    

    默认值来自第一个定义的参数。这是在解析开始时如何设置默认值的函数。对于所有其他输入,它是设置值的最后一个参数

    In [773]: parser.parse_args(['-y'])
    Out[773]: Namespace(switch=True)
    In [774]: parser.parse_args(['-n'])
    Out[774]: Namespace(switch=False)
    In [775]: parser.parse_args(['-n','-y','-n','-y'])
    Out[775]: Namespace(switch=True)
    In [776]: parser.parse_args(['-n','-y','-n'])
    Out[776]: Namespace(switch=False)
    

    也可以使用单独的命令设置默认值:

    parser.set_defaults(switch='foo')
    

    如果您想经常使用这种功能,您可以编写一个小实用函数,创建带有任何标志和目标的参数对。甚至有这样一个增强的错误/问题请求,但我怀疑它是否会被实施。

    【讨论】:

    • 太好了,谢谢你的解释。顺便说一句,您还可以将dest 设置为add_argument 调用的一部分,因此您会得到类似:p.add_argument('--with-x', action='store_true', dest='x')p.add_argument('--without-x', action='store_false', dest='x') 或其他内容。
    猜你喜欢
    • 2011-11-05
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多