Fixed #14698 -- Ensure that module_has_sumodule doesn't mistake a cache miss for an existent package. Thanks to Łukasz Rekucki for the report and patch, and to shields for the test case.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@15362 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
4392c8e67e
commit
56ebab9d85
|
@ -6,8 +6,11 @@ import sys
|
||||||
def module_has_submodule(package, module_name):
|
def module_has_submodule(package, module_name):
|
||||||
"""See if 'module' is in 'package'."""
|
"""See if 'module' is in 'package'."""
|
||||||
name = ".".join([package.__name__, module_name])
|
name = ".".join([package.__name__, module_name])
|
||||||
if name in sys.modules:
|
try:
|
||||||
return True
|
# 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:
|
for finder in sys.meta_path:
|
||||||
if finder.find_module(name):
|
if finder.find_module(name):
|
||||||
return True
|
return True
|
||||||
|
|
|
@ -25,6 +25,10 @@ class DefaultLoader(unittest.TestCase):
|
||||||
self.assertFalse(module_has_submodule(test_module, 'no_such_module'))
|
self.assertFalse(module_has_submodule(test_module, 'no_such_module'))
|
||||||
self.assertRaises(ImportError, import_module, 'regressiontests.utils.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):
|
class EggLoader(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.old_path = sys.path[:]
|
self.old_path = sys.path[:]
|
||||||
|
|
Loading…
Reference in New Issue