summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/utils/module_loading.py7
-rw-r--r--tests/regressiontests/utils/module_loading.py4
2 files changed, 9 insertions, 2 deletions
diff --git a/django/utils/module_loading.py b/django/utils/module_loading.py
index f251035387..32ca69a9fd 100644
--- a/django/utils/module_loading.py
+++ b/django/utils/module_loading.py
@@ -6,8 +6,11 @@ import sys
def module_has_submodule(package, module_name):
"""See if 'module' is in 'package'."""
name = ".".join([package.__name__, module_name])
- if name in sys.modules:
- return True
+ try:
+ # None indicates a cached miss; see mark_miss() in Python/import.c.
+ return sys.modules[name] is not None
+ except KeyError:
+ pass
for finder in sys.meta_path:
if finder.find_module(name):
return True
diff --git a/tests/regressiontests/utils/module_loading.py b/tests/regressiontests/utils/module_loading.py
index cffec9bad9..24c0b0753f 100644
--- a/tests/regressiontests/utils/module_loading.py
+++ b/tests/regressiontests/utils/module_loading.py
@@ -25,6 +25,10 @@ class DefaultLoader(unittest.TestCase):
self.assertFalse(module_has_submodule(test_module, 'no_such_module'))
self.assertRaises(ImportError, import_module, 'regressiontests.utils.test_module.no_such_module')
+ # Don't be confused by caching of import misses
+ import types # causes attempted import of regressiontests.utils.types
+ self.assertFalse(module_has_submodule(sys.modules['regressiontests.utils'], 'types'))
+
class EggLoader(unittest.TestCase):
def setUp(self):
self.old_path = sys.path[:]