为何argparse的store动作致帮助菜单异常?如何关闭大写destination显示?
我之前也碰到过这个烦人的问题!当用store动作时,argparse默认会把参数的destination(目标变量名)转成全大写作为参数值的占位符显示在帮助里,但store_const因为不需要接收输入值,所以不会出现这个情况。不过别担心,只要简单设置一个参数就能搞定。
问题原因
argparse的默认逻辑是:对于需要接收用户输入值的动作(比如store),如果没有显式指定metavar参数,它会自动把destination的名称转成全大写,作为帮助文本里的参数占位符。而store_const不需要用户输入额外值,自然不会显示这个占位符,也就看不到全大写的名字。
解决方案:指定metavar参数
只需要在添加参数时加上metavar参数,设置成你想要显示的文本(比如小写变量名、友好提示文字)即可。
错误示例(会出现全大写destination)
import argparse parser = argparse.ArgumentParser(description="Example list of options") parser.add_argument('-s', '--source', action='store', dest='src_path') parser.add_argument('-e', '--enable', action='store_const', const=True, dest='enable_feature') parser.add_argument('-v', '--verbose', action='store_true') args = parser.parse_args()
运行python3 arg-0.0.1.py -h后,帮助输出里会看到全大写的占位符:
usage: arg-0.0.1.py [-h] [-s SRC_PATH] [-e] [-v]
Example list of options
optional arguments:
-h, --help show this help message and exit
-s SRC_PATH, --source SRC_PATH
-e, --enable
-v, --verbose
这里的SRC_PATH就是dest='src_path'被自动转成的全大写形式。
修复后的示例
修改add_argument,添加metavar参数:
import argparse parser = argparse.ArgumentParser(description="Example list of options") # 指定metavar为小写的path,或者你想要的任意提示文本 parser.add_argument('-s', '--source', action='store', dest='src_path', metavar='path') parser.add_argument('-e', '--enable', action='store_const', const=True, dest='enable_feature') parser.add_argument('-v', '--verbose', action='store_true') args = parser.parse_args()
再次运行-h,帮助菜单就会显示正常的占位符:
usage: arg-0.0.1.py [-h] [-s path] [-e] [-v]
Example list of options
optional arguments:
-h, --help show this help message and exit
-s path, --source path
-e, --enable
-v, --verbose
这样就完全解决了全大写占位符的问题,同时保留store动作的功能。
额外技巧:全局统一修改(可选)
如果你有大量参数,不想逐个添加metavar,可以自定义ArgumentParser子类,重写_get_formatter方法来修改默认格式化逻辑。不过对大多数场景来说,单个指定metavar更清晰灵活,推荐优先使用这种方式。
内容的提问来源于stack exchange,提问作者Atomiklan

