GCC命令行解析的一个很好的特性是“-fmy-option”形式的大多数标志都有一个名为“-fno-my-option”的否定版本。最右边的出现优先,所以你可以在你的CFLAGS或类似的Makefile中附加“-fno-my-option”来禁用一个选项而不破坏其他标志。
我想在一个工具中支持类似的东西,其封装脚本是Python并使用argparse。用store_true
的动作定义两个版本的参数的明显黑客行为不起作用,因为这不会让我要求最恰当的发生。
显然,支持像--my-option=yes
/ --my-option=no
这样的语法很容易,但用户不必传递参数会很好。
有没有办法让argparse为这样的布尔标志打开/关闭开关?
答案 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')
如果你想大量使用这种功能,你可以写一个小实用程序函数,用你想要的任何标志和目标创建一对参数。甚至还有一个针对此类增强的错误/问题请求,但我怀疑它是否会实现。