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

2024-10-03 13:20:31 发布

您现在位置:Python中文网/ 问答频道 /正文

GCC命令行解析的一个很好的特性是“-fmy option”形式的大多数标志都有一个名为“-fno my option”的负版本。最右边的引用优先,因此您只需将“-fno my option”附加到生成文件中的CFLAGS或类似项,即可禁用某个选项,而无需删除其他标志。你知道吗

我想在一个包装器脚本为Python并使用argparse的工具中支持类似的东西。用store_true的动作定义两个版本的参数显然是行不通的,因为这不允许我要求最右边的出现。你知道吗

显然,支持--my-option=yes/--my-option=no这样的语法很容易,但是用户不必传递参数就更好了。你知道吗

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


Tags: 文件命令行版本参数my标志选项argparse
1条回答
网友
1楼 · 发布于 2024-10-03 13:20:31

不需要任何花哨的步法,我就可以设置一对写入同一个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的参数。甚至有一个bug/issues请求这样的增强,但我怀疑它是否会被实现。你知道吗

相关问题 更多 >