From b3d54481fdd33e6db4d56490591b29c123431164 Mon Sep 17 00:00:00 2001
From: Zaida Zhou <58739961+zhouzaida@users.noreply.github.com>
Date: Mon, 14 Mar 2022 00:44:16 +0800
Subject: [PATCH] [Fix] Fallback to use self registry if default_scope not
 found (#122)

---
 mmengine/registry/registry.py        | 11 +++++++++--
 tests/test_registry/test_registry.py |  8 ++++----
 2 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/mmengine/registry/registry.py b/mmengine/registry/registry.py
index 3c55ca14..f0e59a7e 100644
--- a/mmengine/registry/registry.py
+++ b/mmengine/registry/registry.py
@@ -1,6 +1,7 @@
 # Copyright (c) OpenMMLab. All rights reserved.
 import inspect
 import sys
+import warnings
 from collections.abc import Callable
 from typing import Any, Dict, List, Optional, Tuple, Type, Union
 
@@ -382,8 +383,14 @@ class Registry:
             root = self._get_root_registry()
             registry = root._search_child(default_scope)
             if registry is None:
-                raise KeyError(
-                    f'{default_scope} does not exist in the registry tree.')
+                # if `default_scope` can not be found, fallback to use self
+                warnings.warn(
+                    f'Failed to search registry named "{default_scope}". '
+                    'As a workaround, the current registry is used to build '
+                    'instance. This may cause unexpected failure when running '
+                    'the built modules. Please check whether '
+                    f'"{default_scope}" is a correct scope.')
+                registry = self
         else:
             registry = self
 
diff --git a/tests/test_registry/test_registry.py b/tests/test_registry/test_registry.py
index 61d55c9a..344762d7 100644
--- a/tests/test_registry/test_registry.py
+++ b/tests/test_registry/test_registry.py
@@ -341,14 +341,14 @@ class TestRegistry:
         assert isinstance(MID_HOUNDS.build(b_cfg), Beagle)
 
         # test `default_scope`
-        # `default_scope` is an invalid scope
-        with pytest.raises(KeyError):
-            LITTLE_HOUNDS.build(b_cfg, default_scope='invalid_mid_hound')
-
         # switch the current registry to another registry
         dog = LITTLE_HOUNDS.build(b_cfg, default_scope='mid_hound')
         assert isinstance(dog, Beagle)
 
+        # `default_scope` can not be found
+        dog = MID_HOUNDS.build(b_cfg, default_scope='scope-not-found')
+        assert isinstance(dog, Beagle)
+
     def test_repr(self):
         CATS = Registry('cat')
 
-- 
GitLab