argparse multi command

貓橘毛 aka Lanfon
2 min readMay 3, 2020

--

畢竟都用了就稍微記錄一下…(剛好也開桌機有鍵盤快速打字QQ)

前幾天寫了個 cli tool 拿來操作 google drive,裡面花最多時間的是寫 argparse 的 multi command,認份點記錄一下。(code 可以看第一版的比較安全,以免之後改惹)

簡單來說,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。

題外話,

  1. 雖然 add_subparsers 名稱最後有個 s ,但實際上它只能被呼叫一次。(完全就是 method naming 的 anti-pattern 最佳範例…)
  2. 不用使用 add_subparsers 也是可以實作 multi-commands 的,在 parser.add_argument 裡把 nargsargparse.REMAINDER 全部抓下來之後就可以再 propagate 給另一個 ArgumentParser instance ,和 add_subparsers 做出來的效果是一樣的。
  3. Click 是相對比較多人用 & 完整(複雜)的 3rd party library 。(但有時候簡單的 tool 還要再裝 click 我是覺得有點捨本逐末惹)

沒惹,好懶……..

--

--

貓橘毛 aka Lanfon
貓橘毛 aka Lanfon

Written by 貓橘毛 aka Lanfon

知,不知,上;不知,知,病。

No responses yet