summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
Diffstat (limited to 'Lib')
-rw-r--r--Lib/importlib/_bootstrap_external.py6
-rw-r--r--Lib/test/test_importlib/import_/test_path.py21
-rw-r--r--Lib/test/test_importlib/test_api.py2
3 files changed, 26 insertions, 3 deletions
diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py
index 420ecc8..da9a75c 100644
--- a/Lib/importlib/_bootstrap_external.py
+++ b/Lib/importlib/_bootstrap_external.py
@@ -1181,8 +1181,10 @@ class PathFinder:
def invalidate_caches(cls):
"""Call the invalidate_caches() method on all path entry finders
stored in sys.path_importer_caches (where implemented)."""
- for finder in sys.path_importer_cache.values():
- if hasattr(finder, 'invalidate_caches'):
+ for name, finder in list(sys.path_importer_cache.items()):
+ if finder is None:
+ del sys.path_importer_cache[name]
+ elif hasattr(finder, 'invalidate_caches'):
finder.invalidate_caches()
@classmethod
diff --git a/Lib/test/test_importlib/import_/test_path.py b/Lib/test/test_importlib/import_/test_path.py
index 7aa26b0..18c81dd 100644
--- a/Lib/test/test_importlib/import_/test_path.py
+++ b/Lib/test/test_importlib/import_/test_path.py
@@ -184,6 +184,27 @@ class FinderTests:
# Do not want FileNotFoundError raised.
self.assertIsNone(self.machinery.PathFinder.find_spec('whatever'))
+ def test_invalidate_caches_finders(self):
+ # Finders with an invalidate_caches() method have it called.
+ class FakeFinder:
+ def __init__(self):
+ self.called = False
+
+ def invalidate_caches(self):
+ self.called = True
+
+ cache = {'leave_alone': object(), 'finder_to_invalidate': FakeFinder()}
+ with util.import_state(path_importer_cache=cache):
+ self.machinery.PathFinder.invalidate_caches()
+ self.assertTrue(cache['finder_to_invalidate'].called)
+
+ def test_invalidate_caches_clear_out_None(self):
+ # Clear out None in sys.path_importer_cache() when invalidating caches.
+ cache = {'clear_out': None}
+ with util.import_state(path_importer_cache=cache):
+ self.machinery.PathFinder.invalidate_caches()
+ self.assertEqual(len(cache), 0)
+
class FindModuleTests(FinderTests):
def find(self, *args, **kwargs):
diff --git a/Lib/test/test_importlib/test_api.py b/Lib/test/test_importlib/test_api.py
index 8beb424..edb745c 100644
--- a/Lib/test/test_importlib/test_api.py
+++ b/Lib/test/test_importlib/test_api.py
@@ -406,7 +406,7 @@ class InvalidateCacheTests:
# There should be no issues if the method is not defined.
key = 'gobbledeegook'
sys.path_importer_cache[key] = None
- self.addCleanup(lambda: sys.path_importer_cache.__delitem__(key))
+ self.addCleanup(lambda: sys.path_importer_cache.pop(key, None))
self.init.invalidate_caches() # Shouldn't trigger an exception.