如何管理 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.check
和 args.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'更简单。
更好的是,选择一个作为默认选项,然后只为另一个提供一个选项。只要默认是明确的,就真的不需要两个参数。
我正在使用 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.check
和 args.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'更简单。
更好的是,选择一个作为默认选项,然后只为另一个提供一个选项。只要默认是明确的,就真的不需要两个参数。