argparse:模拟GCC的“-fno- <option>”语义

时间:2016-10-19 10:46:28

标签: python command-line-arguments argparse

GCC命令行解析的一个很好的特性是“-fmy-option”形式的大多数标志都有一个名为“-fno-my-option”的否定版本。最右边的出现优先,所以你可以在你的CFLAGS或类似的Makefile中附加“-fno-my-option”来禁用一个选项而不破坏其他标志。

我想在一个工具中支持类似的东西,其封装脚本是Python并使用argparse。用store_true的动作定义两个版本的参数的明显黑客行为不起作用,因为这不会让我要求最恰当的发生。

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

有没有办法让argparse为这样的布尔标志打开/关闭开关?

1 个答案:

答案 0 :(得分:2)

如果没有任何花哨的脚步,我可以设置一对写入相同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')

如果你想大量使用这种功能,你可以写一个小实用程序函数,用你想要的任何标志和目标创建一对参数。甚至还有一个针对此类增强的错误/问题请求,但我怀疑它是否会实现。