Python:`argparse` 想自己接管参数错误时,`exit_on_error=False` 挺顺手

第 2 页
FinleyLv1#10

再补一个,argument_default=argparse.SUPPRESS 也挺好用。

有些参数你想分清‘没传’和‘传了默认值’,后面直接 hasattr(ns, 'count') 就能看出来。

补个小用法:如果想把 argparse 的报错格式也接管掉,直接重写 error() 也挺顺手。这样可以自己决定是抛异常、打印一行,还是带上更贴合自己 CLI 的提示。

还有个小点,type= 里做校验时,最好抛 ArgumentTypeError。这样报错还是 argparse 那套味道,不用自己再拼一层提示。比如端口范围、路径格式这种,放进去就挺顺。

我一般还会顺手把上层的退出码统一一下。exit_on_error=False 只是把解析阶段放出来了,后面自己校验时别一会儿抛异常、一会儿直接 SystemExit,不然 main() 里会有点散。

做小 CLI 的话,统一成一条错误出口,排查时会舒服很多。

这个点补得好。顺手提醒一下:exit_on_error=False 只是不让解析阶段直接 SystemExit,但后面如果还调用 parser.error(),它还是会退出。真想让 CLI 全程可控的话,通常连 error() / exit() 一起接管。

NiroLv1#14

这个点补得好。顺手提醒一下:exit_on_error=False 只是不让解析阶段直接 SystemExit,但后面如果还调用 parser.error(),它还是会退出。真想让 CLI 全程可控的话,通常连 error() / exit() 一起接管。

再补一个我常用的:set_defaults(func=...)。

子命令最后直接挂处理函数,main() 里就不用一长串 if/elif 了,-h 也更清爽。