Python的argparse.add_argument传字典时option_strings失效是为什么?
问题根因
argparse.ArgumentParser.add_argument 方法的设计规定,所有选项字符串(如--my-arg)必须通过位置参数传入,方法内部会直接收集所有位置参数作为option_strings的值,不会从关键字参数中读取该字段。
你在参数字典中传入的option_strings属于关键字参数,会被add_argument方法内部生成的option_strings直接覆盖——由于你第一种写法没有传入位置参数,内部生成的option_strings是空列表,最终就出现了你观测到的option_strings=[]、参数无法识别的问题。
核心逻辑验证
标准库argparse.py中add_argument的简化实现逻辑如下:
def add_argument(self, *args, **kwargs): # 直接从位置参数提取option_strings,不读取kwargs中的同名字段 option_strings = args # 其他参数处理逻辑 action_cls = self._pop_action_class(kwargs) # 构造Action时传入的是内部生成的option_strings,覆盖kwargs中的值 return self._add_action(action_cls(option_strings=option_strings, **kwargs))
优化的复用方案
如果要统一定义参数减少重复代码,可以将选项字符串和其他参数分开存储:
# 统一定义参数规则:(选项字符串列表, 其他参数字典) my_arg = (['--my-arg'], {'dest': 'my_arg', 'help': 'My string argument goes here'}) # 调用时分别解包位置参数和关键字参数 parser_mode.add_argument(*my_arg[0], **my_arg[1])
内容的提问来源于stack exchange,提问作者Vercingatorix
相关产品推荐
相关产品推荐

