如何替换argparse.ArgumentParser中已存在的命令行参数?
解决argparse重复添加参数冲突及参数修改问题
方法1:直接修改已存在的参数配置
argparse的Parser实例里,所有添加的参数都存在parser._actions列表中,遍历这个列表找到目标参数后,直接修改它的属性即可,不用重新调用add_argument:
# 遍历找到--hidden_size对应的参数配置 for action in parser._actions: if '--hidden_size' in action.option_strings: # 按需修改属性,比如type、help、default、metavar等 action.type = int action.help = '修改后的隐藏层大小' action.metavar = 'N' break
方法2:先移除原有参数再重新添加
如果一定要重新调用add_argument,可以先把原有参数从Parser的私有属性中移除,再重新添加:
target_option = '--hidden_size' # 从option字符串映射表中删除目标参数 if target_option in parser._option_string_actions: action = parser._option_string_actions.pop(target_option) # 从actions列表中移除对应的配置项 parser._actions.remove(action) # 现在可以正常重新添加参数了 parser.add_argument('--hidden_size', type=int, metavar='N', help='Hidden size')
注:这里操作的是argparse的私有属性(带_前缀),虽然官方未公开,但实际使用中稳定性足够,适合快速解决问题。
方法3:封装下标访问功能(实现你想要的parser['--hidden_size'])
如果想更直观地通过下标访问参数,可以自定义一个继承自argparse.ArgumentParser的类,添加__getitem__方法:
import argparse class MyParser(argparse.ArgumentParser): def __getitem__(self, option_str): for action in self._actions: if option_str in action.option_strings: return action raise KeyError(f"Option {option_str} not found") # 使用自定义Parser创建实例 parser = MyParser() parser.add_argument('--hidden_size', type=int, default=128) # 直接通过下标访问并修改参数配置 arg = parser['--hidden_size'] arg.help = '更新后的隐藏层大小说明' arg.default = 256
内容的提问来源于stack exchange,提问作者mxcx
相关产品推荐
相关产品推荐

