如何管理 argparse 中的优先级?

How to manage precedence in 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:建议的答案确实顺便回答了我的问题,但相关的问题不是同一个。

参见argparse documentation。这是您可能想要的示例。我已经包含了几个您可能不需要的选项——我认为这比将它们关闭而您需要它们要好。

>>> parser = argparse.ArgumentParser()
>>> group = parser.add_mutually_exclusive_group(required=True)
>>> group.add_argument('--check', action='store_true', dest="check")
>>> group.add_argument('--nocheck', action='store_false', dest="check")
>>> parser.parse_args(["--check"])
Namespace(check=True)
>>> parser.parse_args(["--nocheck"])
Namespace(check=False)

您可能不想要互斥部分——在这种情况下删除第二行并将 group 替换为 parser。如果这样做,您可能希望添加此行:

>>> parser.set_defaults(check=False)

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

在:

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

你最后测试 nocheck,这样一个就会覆盖 check

argparse 尝试以独立于顺序的方式处理可选参数(标记的参数)。

如果他们写入同一个 'dest',那将是您最终看到的最后一个。查看输入内容以及输入顺序的一种方法是使用 'append' 操作:

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'更简单。

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