如何在argparse中管理优先级?

时间:2015-09-17 16:27:38

标签: python python-2.7 argparse

我使用argparse来管理命令行选项,我希望管理两个选项--check--nocheck。 我实际上在mybadscript.py中做了类似的事情:

[...]
args = parser.parse_args()

if args.check:
    check = True

if args.nocheck:
    check = False
[...]

问题是如果以这种方式启动脚本:

python mybadscript.py --nocheck --check

check将设置为False。这是不正确的,因为最后一个选项是--check

我如何正确管理它们?

PS:我知道只使用一个选项就可以轻松避免它,但我知道如何使用argparse来管理选项优先级,因为您可以在更复杂的场景中遇到它。

PPS:建议的答案偶然回答了我的问题,但相关问题并不相同。

2 个答案:

答案 0 :(得分:6)

请参阅argparse documentation。这是你可能想要的一个例子。我已经包含了一些您可能不需要的选项 - 我认为这比将它们关闭并且需要它们更好。

addr

您可能不希望相互排斥的部分内容删除第二行并将 替换为MariaDB [db]> 。如果您这样做,您可能希望添加以下行:

~

答案 1 :(得分:1)

您有两个参数可以独立设置两个不同的命名空间属性args.checkargs.nocheck。使用--nocheck --check输入行,两者都已设置。

在:

if args.check:
    check = True
if args.nocheck:
    check = False

最后测试nocheck,以便覆盖check

argparse尝试以与订单无关的方式处理选项(标记的参数)。

如果他们写相同的'dest',那么这是你最后会看到的。查看输入内容以及以何种顺序显示的一种方法是使用“追加”操作:

parser=argparse.ArgumentParser()
parser.add_argument('--check', dest='checked', action='append_const', const=True)
 parser.add_argument('--nocheck', dest='checked', action='append_const', const=False)

In [14]: parser.parse_args(''.split()) # no arg
Out[14]: Namespace(checked=None)

我本可以制作默认的[]

In [15]: parser.parse_args('--check'.split())
Out[15]: Namespace(checked=[True])

In [16]: parser.parse_args('--nocheck'.split())
Out[16]: Namespace(checked=[False])

In [17]: parser.parse_args('--nocheck --check --nocheck'.split())
Out[17]: Namespace(checked=[False, True, False])

另一个答案中配对的'store_true'和'store_false'更简单。

更好的是,选择一个作为默认选项,并为另一个选择提供一个选项。只要默认值是明确的,就不需要两个参数。