You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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):
    1. 先把Solver.DEFAULTS里的默认配置键值对添加到实例的__dict__中;
    2. 再通过**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(),同时调整字典的取值方式:

  1. 先给你的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'
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 19:08:14