From 7a9d1f57cd8fb1bf8b584b92f509b401c60a7f91 Mon Sep 17 00:00:00 2001 From: Megvii Engine Team Date: Wed, 14 Apr 2021 18:01:21 +0800 Subject: [PATCH] fix(mge/module): fix module attribute update mistake GitOrigin-RevId: 842a8fcb6efd4a207be4d211fcdeaa3736fae284 --- imperative/python/megengine/module/module.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/imperative/python/megengine/module/module.py b/imperative/python/megengine/module/module.py index cd0af84b..1569e2e3 100644 --- a/imperative/python/megengine/module/module.py +++ b/imperative/python/megengine/module/module.py @@ -614,22 +614,26 @@ class Module(metaclass=ABCMeta): return value def __setattr__(self, name: str, value): - if _is_module(value) or ( - isinstance(value, (list, tuple, dict)) and name != "_modules" - ): + is_module_like = _is_module(value) or isinstance(value, (list, tuple, dict)) + if name != "_modules": modules = self.__dict__.get("_modules") - if modules is None: + if modules is None and is_module_like: raise AttributeError( "cannot assign module before Module.__init__() call" ) - if name not in self.__dict__: - modules.append(name) + if is_module_like: + if name not in modules: + modules.append(name) + else: + if modules is not None and name in modules: + modules.remove(name) super().__setattr__(name, value) def __delattr__(self, name: str): if name in self.__dict__ and _is_module(self.__dict__[name]): modules = self.__dict__.get("_modules") - modules.remove(name) + if name in modules: + modules.remove(name) super().__delattr__(name) def _module_info_string(self) -> str: