如何修改argparse位置参数的目标变量名称?
解决argparse位置参数dest与显示名称冲突问题
问题原因
你遇到的报错是因为位置参数的第一个参数会被argparse默认当作dest的值,当你同时显式指定dest='targets'时,相当于重复给同一个位置参数设置了两次目标变量名,触发了ValueError。
正确解决方案
用metavar参数定制帮助信息里的显示名称,同时保留dest的正确复数命名(无需显式指定dest,直接将第一个参数设为targets即可):
# Public function for use from other scripts def run(targets: list[str]): pass if __name__ == '__main__': from argparse import ArgumentParser parser = ArgumentParser() # 第一个参数设为dest值targets,用metavar指定帮助显示的单数名称 parser.add_argument('targets', metavar='target', nargs='*', default=['.']) run(**vars(parser.parse_args()))
原理说明
metavar是argparse专门用来定制帮助信息中参数显示名称的参数,不会影响实际解析后得到的属性名(即dest)。- 当使用
nargs='*'时,argparse会自动在metavar后加上...,帮助信息里会显示为[target ...],完全符合你想要的单数显示效果。 - 解析后得到的
Namespace对象包含targets属性,和run函数的参数完美匹配,直接用vars()传递参数即可保证CLI和库API的一致性。
内容的提问来源于stack exchange,提问作者Dominik Kaszewski
相关产品推荐
相关产品推荐

