【发布时间】:2021-11-19 15:03:09
【问题描述】:
在使用带有子命令的argparse 的程序中,我想添加参数来控制详细程度。我希望这些充当“全局”参数,这意味着它们是在子命令之前还是之后传递都无关紧要。换句话说,我希望以相同的方式解释以下调用:
> ./test.py -v -v foo
> ./test.py foo -v -v
> ./test.py -v foo -v
我尝试过的事情
将参数添加到父解析器和子命令解析器:
main = arg.ArgumentParser()
main.add_argument ("-v", "--verbose", default = 0, action = "count")
s = main.add_subparsers()
foo = s.add_parser ("foo")
foo.add_argument ("-v", "--verbose", default = 0, action = "count")
print (main.parse_args().verbose)
这给出(都应该是2):
| Invocation | Result |
|---|---|
./test.py -v -v foo |
0 |
./test.py foo -v -v |
2 |
./test.py -v foo -v |
1 |
向主命令解析器和子命令解析器添加一个通用的“父”解析器:
受this question 启发,不同之处在于在另一个问题中一次只有一个子命令处于活动状态,而这里的主解析器和子命令解析器同时处于活动状态。
p = arg.ArgumentParser (add_help = False)
p.add_argument ("-v", "--verbose", default = 0, action = "count")
main = arg.ArgumentParser (parents = [ p ])
s = main.add_subparsers()
foo = s.add_parser ("foo", parents = [ p ])
print (main.parse_args().verbose)
这给出了与上面相同的结果。
将主解析器声明为子命令解析器的父级:
main = arg.ArgumentParser()
main.add_argument ("-v", "--verbose", default = 0, action = "count")
s = main.add_subparsers()
foo = s.add_parser ("foo", parents = [ main ], add_help = False)
print (main.parse_args().verbose)
这会导致foo 子命令本身期望的无限递归:
> ./test.py -v -v foo
usage: test.py foo [-h] [-v] {foo} ...
test.py foo: error: too few arguments
将参数添加到具有不同目的地的父和子命令解析器:
main = arg.ArgumentParser()
main.add_argument ("-v", "--verbose", default = 0, action = "count", dest = "main_verbose")
s = main.add_subparsers()
foo = s.add_parser ("foo")
foo.add_argument ("-v", "--verbose", default = 0, action = "count")
args = main.parse_args()
print (args.main_verbose + args.verbose)
这行得通,但它增加了复杂性:现在我需要组合每个公共参数的值,以及与嵌套子命令一样多的层。
有没有一种方法可以定义“全局”参数,无论它们放在命令行的什么位置,它的作用都是一样的?
【问题讨论】:
-
别偷懒。使用最后一个有效的