Commit 7bd329d8 authored by Brett Cannon's avatar Brett Cannon

Issue #12599: Be more strict in accepting None vs. a false-like object

in importlib.

Thanks to PJE for pointing out the issue and Nick Coghlan for filing
the bug.
parent 64befe93
...@@ -217,7 +217,7 @@ def module_for_loader(fxn): ...@@ -217,7 +217,7 @@ def module_for_loader(fxn):
""" """
def module_for_loader_wrapper(self, fullname, *args, **kwargs): def module_for_loader_wrapper(self, fullname, *args, **kwargs):
module = sys.modules.get(fullname) module = sys.modules.get(fullname)
is_reload = bool(module) is_reload = module is not None
if not is_reload: if not is_reload:
# This must be done before open() is called as the 'io' module # This must be done before open() is called as the 'io' module
# implicitly imports 'locale' and would otherwise trigger an # implicitly imports 'locale' and would otherwise trigger an
...@@ -711,7 +711,7 @@ class PathFinder: ...@@ -711,7 +711,7 @@ class PathFinder:
If 'hooks' is false then use sys.path_hooks. If 'hooks' is false then use sys.path_hooks.
""" """
if not hooks: if hooks is None:
hooks = sys.path_hooks hooks = sys.path_hooks
for hook in hooks: for hook in hooks:
try: try:
...@@ -753,7 +753,7 @@ class PathFinder: ...@@ -753,7 +753,7 @@ class PathFinder:
def find_module(cls, fullname, path=None): def find_module(cls, fullname, path=None):
"""Find the module on sys.path or 'path' based on sys.path_hooks and """Find the module on sys.path or 'path' based on sys.path_hooks and
sys.path_importer_cache.""" sys.path_importer_cache."""
if not path: if path is None:
path = sys.path path = sys.path
for entry in path: for entry in path:
try: try:
......
...@@ -42,6 +42,15 @@ class FinderTests(unittest.TestCase): ...@@ -42,6 +42,15 @@ class FinderTests(unittest.TestCase):
loader = machinery.PathFinder.find_module(module, [path]) loader = machinery.PathFinder.find_module(module, [path])
self.assertTrue(loader is importer) self.assertTrue(loader is importer)
def test_empty_list(self):
# An empty list should not count as asking for sys.path.
module = 'module'
path = '<test path>'
importer = util.mock_modules(module)
with util.import_state(path_importer_cache={path: importer},
path=[path]):
self.assertIsNone(machinery.PathFinder.find_module('module', []))
def test_path_hooks(self): def test_path_hooks(self):
# Test that sys.path_hooks is used. # Test that sys.path_hooks is used.
# Test that sys.path_importer_cache is set. # Test that sys.path_importer_cache is set.
......
...@@ -65,9 +65,23 @@ class ModuleForLoaderTests(unittest.TestCase): ...@@ -65,9 +65,23 @@ class ModuleForLoaderTests(unittest.TestCase):
self.assertEqual(wrapped.__name__, fxn.__name__) self.assertEqual(wrapped.__name__, fxn.__name__)
self.assertEqual(wrapped.__qualname__, fxn.__qualname__) self.assertEqual(wrapped.__qualname__, fxn.__qualname__)
class SetPackageTests(unittest.TestCase): def test_false_module(self):
# If for some odd reason a module is considered false, still return it
# from sys.modules.
class FalseModule(types.ModuleType):
def __bool__(self): return False
name = 'mod'
module = FalseModule(name)
with test_util.uncache(name):
self.assertFalse(module)
sys.modules[name] = module
given = self.return_module(name)
self.assertTrue(given is module)
class SetPackageTests(unittest.TestCase):
"""Tests for importlib.util.set_package.""" """Tests for importlib.util.set_package."""
def verify(self, module, expect): def verify(self, module, expect):
......
...@@ -10,6 +10,10 @@ What's New in Python 3.3.0 Alpha 3? ...@@ -10,6 +10,10 @@ What's New in Python 3.3.0 Alpha 3?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #12599: Be more strict in accepting None compared to a false-like
object for importlib.util.module_for_loader and
importlib.machinery.PathFinder.
- Issue #14592: Attempting a relative import w/o __package__ or __name__ set in - Issue #14592: Attempting a relative import w/o __package__ or __name__ set in
globals raises a KeyError. globals raises a KeyError.
......
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment