簡單來說,37之後 add_subparsers
新增了 required
的參數,但有趣的是你如果只寫 arg.add_subparsers(required=True)
的話,sub command 在沒有輸入的時候並不會跳 required command 的 error 而是
TypeError: sequence item 0: expected str instance, NoneType found
簡單來從官方的 example 解釋:
>>> parser.parse_args(['--help'])
usage: PROG [-h] [--foo] {a,b} ...
positional arguments:
{a,b} sub-command help
a a help
b b help
sub command 在 default 的顯示方式會是類似 set 的表示式(如上的 {a, b}),在 arg.dd_subparsers
的時候得額外加上 metavar
或 dest
讓你的 subcommand 有地方存才不會出現 argparse 的 TypeError。
題外話,
- 雖然
add_subparsers
名稱最後有個 s ,但實際上它只能被呼叫一次。(完全就是 method naming 的 anti-pattern 最佳範例…) - 不用使用
add_subparsers
也是可以實作 multi-commands 的,在parser.add_argument
裡把 nargs 用argparse.REMAINDER
全部抓下來之後就可以再 propagate 給另一個ArgumentParser
instance ,和add_subparsers
做出來的效果是一樣的。 - Click 是相對比較多人用 & 完整(複雜)的 3rd party library 。(但有時候簡單的 tool 還要再裝 click 我是覺得有點捨本逐末惹)
沒惹,好懶……..