Anomaly-Transformer中__dict__.update及自定义参数传递问题
关于Anomaly-Transformer中Solver类的两个问题解答
问题1:__dict__.update的含义
先看你提供的代码:
class Solver(object): DEFAULTS = {} def __init__(self, config): self.__dict__.update(Solver.DEFAULTS, **config)
这段代码的作用是快速给Solver实例批量设置属性,具体拆解:
self.__dict__:Python中每个对象都自带一个__dict__字典,专门存储该实例的所有属性与对应值。update(Solver.DEFAULTS, **config):- 先把
Solver.DEFAULTS里的默认配置键值对添加到实例的__dict__中; - 再通过
**config解包传入的config字典,用其中的键值对覆盖或新增实例属性(如果config和DEFAULTS有重复键,config的值会优先覆盖默认值)。
- 先把
这种写法能避免逐个手动赋值self.lr = config['lr']这类重复代码,高效完成实例属性的初始化。
问题2:解决Jupyter Notebook中传入字典的报错
报错原因
你传入的config是普通Python字典,但vars()函数要求参数必须是拥有__dict__属性的对象(比如argparse生成的Namespace实例),因此会抛出TypeError: vars() argument must have dict attribute。
两种解决方法
方法1:直接适配字典参数修改main函数
因为Solver的__init__本来就支持接收字典,所以可以直接去掉vars(),同时调整字典的取值方式:
- 先给你的config字典补上
mode键(原代码需要判断该字段):
config = { "lr": 1e-4, "num_epochs": 2, "win_size":20, "input_c":6, "output_c":6, "batch_size":8, "anormly_ratio":4.00, "mode": "train" # 新增mode字段,可选'train'或'test' }
- 修改main函数:
def main(config): solver = Solver(config) # 直接传入字典,去掉vars() if config['mode'] == 'train': # 字典用[]取值,代替原有的.属性访问 solver.train() elif config['mode'] == 'test': solver.test() return solver
方法2:将字典转换为Namespace对象
如果不想修改main函数里的属性访问方式(依然想用config.mode),可以把字典转成argparse.Namespace实例:
from argparse import Namespace # 先给字典加mode字段 config_dict = { "lr": 1e-4, "num_epochs": 2, "win_size":20, "input_c":6, "output_c":6, "batch_size":8, "anormly_ratio":4.00, "mode": "train" } # 转换为Namespace对象 config = Namespace(**config_dict) # 直接调用main main(config)
这样vars(config)会正常返回字典,config.mode也能正常访问,完全兼容原main函数的逻辑。
内容的提问来源于stack exchange,提问作者Sar99
相关产品推荐
相关产品推荐

