我使用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:建议的答案偶然回答了我的问题,但相关问题并不相同。
答案 0 :(得分:6)
请参阅argparse documentation。这是你可能想要的一个例子。我已经包含了一些您可能不需要的选项 - 我认为这比将它们关闭并且需要它们更好。
addr
您可能不希望相互排斥的部分内容删除第二行并将
替换为MariaDB [db]>
。如果您这样做,您可能希望添加以下行:
~
答案 1 :(得分:1)
您有两个参数可以独立设置两个不同的命名空间属性args.check
和args.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'更简单。
更好的是,选择一个作为默认选项,并为另一个选择提供一个选项。只要默认值是明确的,就不需要两个参数。