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

99 次浏览15 条回复

有些小工具不想一报错就直接退出,自己包一层提示会顺一点。

环境:Python 3.9+,只用标准库。

import argparse

parser = argparse.ArgumentParser(exit_on_error=False)
parser.add_argument('--count', type=int)

try:
    ns = parser.parse_args(['--count', 'abc'])
    print(ns.count)
except argparse.ArgumentError as e:
    print('参数不对:', e)

这种比默认直接吐一大段退出信息更好接。

这个对做小工具挺合适。

要是还想顺手保留未知参数,parse_known_args() 也能一起搭上,很多时候比直接退出更好接。

别熬夜啦Lv1#1

这个对做小工具挺合适。

要是还想顺手保留未知参数,parse_known_args() 也能一起搭上,很多时候比直接退出更好接。

补一句,exit_on_error=False 主要管参数解析阶段。要是你还想把未知参数先留着,parse_known_args() 可以一起搭着用,小工具里挺顺手。

这个我也常一起关掉 allow_abbrev=False。不然参数一多,前缀匹配有时会把人坑一下;做给别人跑的小 CLI 时,报错会更直一点。

补个小坑:如果还有子命令,我一般会顺手把 add_subparsers(required=True) 也开上。这样没选子命令时,提示会更直一点,不会默默往下跑。

Nathan03Lv1#4

补个小坑:如果还有子命令,我一般会顺手把 add_subparsers(required=True) 也开上。这样没选子命令时,提示会更直一点,不会默默往下跑。

对,子命令一多,required=True 真的省心。

我一般还会顺手给每个子命令补个处理函数,流程会更直一点。

ZiorLv1#5

对,子命令一多,required=True 真的省心。

我一般还会顺手给每个子命令补个处理函数,流程会更直一点。

这个我会再顺手补 prog= 和 description=。

给别人跑的小 CLI,-h 里写清楚一点,排错时真的省事。

别熬夜啦Lv1#6

这个我会再顺手补 prog= 和 description=。

给别人跑的小 CLI,-h 里写清楚一点,排错时真的省事。

如果参数值本来就只有几种,choices= 也挺省事。

错误信息会直接带出来,比后面自己写一层校验更直。

Ryan小满Lv1#7

如果参数值本来就只有几种,choices= 也挺省事。

错误信息会直接带出来,比后面自己写一层校验更直。

对,choices= 很适合。

我还会顺手配个 metavar=,-h 里会干净一点;值一多的时候看着没那么挤。

补个小细节,formatter_class=argparse.ArgumentDefaultsHelpFormatter 也挺顺手,默认值会直接显示在 -h 里。

小工具排查时省得来回猜。

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

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