Issue #13959: Deprecate imp.get_suffixes() for new attributes on
importlib.machinery that provide the suffix details for import.
The attributes were not put on imp so as to compartmentalize
everything importlib needs for setting up imports in
importlib.machinery.
This also led to an indirect deprecation of inspect.getmoduleinfo() as
it directly returned imp.get_suffix's returned tuple which no longer
makes sense.
diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py
index 9952b06..ce23043 100644
--- a/Lib/importlib/_bootstrap.py
+++ b/Lib/importlib/_bootstrap.py
@@ -163,11 +163,14 @@
_PYCACHE = '__pycache__'
-_SOURCE_SUFFIXES = ['.py'] # _setup() adds .pyw as needed.
+SOURCE_SUFFIXES = ['.py'] # _setup() adds .pyw as needed.
-_DEBUG_BYTECODE_SUFFIX = '.pyc'
-_OPT_BYTECODE_SUFFIX = '.pyo'
-_BYTECODE_SUFFIX = _DEBUG_BYTECODE_SUFFIX if __debug__ else _OPT_BYTECODE_SUFFIX
+DEBUG_BYTECODE_SUFFIXES = ['.pyc']
+OPTIMIZED_BYTECODE_SUFFIXES = ['.pyo']
+if __debug__:
+ BYTECODE_SUFFIXES = DEBUG_BYTECODE_SUFFIXES
+else:
+ BYTECODE_SUFFIXES = OPTIMIZED_BYTECODE_SUFFIXES
def cache_from_source(path, debug_override=None):
"""Given the path to a .py file, return the path to its .pyc/.pyo file.
@@ -181,10 +184,13 @@
"""
debug = __debug__ if debug_override is None else debug_override
- suffix = _DEBUG_BYTECODE_SUFFIX if debug else _OPT_BYTECODE_SUFFIX
+ if debug:
+ suffixes = DEBUG_BYTECODE_SUFFIXES
+ else:
+ suffixes = OPTIMIZED_BYTECODE_SUFFIXES
head, tail = _path_split(path)
base_filename, sep, _ = tail.partition('.')
- filename = ''.join([base_filename, sep, _TAG, suffix])
+ filename = ''.join([base_filename, sep, _TAG, suffixes[0]])
return _path_join(head, _PYCACHE, filename)
@@ -1147,15 +1153,15 @@
setattr(self_module, '_MAGIC_NUMBER', _imp_module.get_magic())
setattr(self_module, '_TAG', _imp.get_tag())
if builtin_os == 'nt':
- _SOURCE_SUFFIXES.append('.pyw')
+ SOURCE_SUFFIXES.append('.pyw')
def _install(sys_module, _imp_module):
"""Install importlib as the implementation of import."""
_setup(sys_module, _imp_module)
extensions = ExtensionFileLoader, _imp_module.extension_suffixes(), False
- source = SourceFileLoader, _SOURCE_SUFFIXES, True
- bytecode = SourcelessFileLoader, [_BYTECODE_SUFFIX], True
+ source = SourceFileLoader, SOURCE_SUFFIXES, True
+ bytecode = SourcelessFileLoader, BYTECODE_SUFFIXES, True
supported_loaders = [extensions, source, bytecode]
sys.path_hooks.extend([FileFinder.path_hook(*supported_loaders)])
sys.meta_path.extend([BuiltinImporter, FrozenImporter, PathFinder])
diff --git a/Lib/importlib/machinery.py b/Lib/importlib/machinery.py
index 07465ce..d5e7250 100644
--- a/Lib/importlib/machinery.py
+++ b/Lib/importlib/machinery.py
@@ -1,5 +1,9 @@
"""The machinery of importlib: finders, loaders, hooks, etc."""
+import _imp
+
+from ._bootstrap import (SOURCE_SUFFIXES, DEBUG_BYTECODE_SUFFIXES,
+ OPTIMIZED_BYTECODE_SUFFIXES, BYTECODE_SUFFIXES)
from ._bootstrap import BuiltinImporter
from ._bootstrap import FrozenImporter
from ._bootstrap import PathFinder
@@ -7,3 +11,5 @@
from ._bootstrap import SourceFileLoader
from ._bootstrap import SourcelessFileLoader
from ._bootstrap import ExtensionFileLoader
+
+EXTENSION_SUFFIXES = _imp.extension_suffixes()
diff --git a/Lib/importlib/test/benchmark.py b/Lib/importlib/test/benchmark.py
index 1686314..183e818 100644
--- a/Lib/importlib/test/benchmark.py
+++ b/Lib/importlib/test/benchmark.py
@@ -9,7 +9,6 @@
import decimal
import imp
import importlib
-import importlib._bootstrap
import importlib.machinery
import json
import os
@@ -72,7 +71,7 @@
assert not os.path.exists(imp.cache_from_source(mapping[name]))
sys.meta_path.append(importlib.machinery.PathFinder)
loader = (importlib.machinery.SourceFileLoader,
- importlib._bootstrap._SOURCE_SUFFIXES, True)
+ importlib.machinery.SOURCE_SUFFIXES, True)
sys.path_hooks.append(importlib.machinery.FileFinder.path_hook(loader))
for result in bench(name, lambda: sys.modules.pop(name), repeat=repeat,
seconds=seconds):
@@ -110,7 +109,7 @@
with source_util.create_modules(name) as mapping:
sys.meta_path.append(importlib.machinery.PathFinder)
loader = (importlib.machinery.SourceFileLoader,
- importlib._bootstrap._SOURCE_SUFFIXES, True)
+ importlib.machinery.SOURCE_SUFFIXES, True)
sys.path_hooks.append(importlib.machinery.FileFinder.path_hook(loader))
def cleanup():
sys.modules.pop(name)
@@ -145,7 +144,7 @@
with source_util.create_modules(name) as mapping:
sys.meta_path.append(importlib.machinery.PathFinder)
loader = (importlib.machinery.SourceFileLoader,
- importlib._bootstrap._SOURCE_SUFFIXES, True)
+ importlib.machinery.SOURCE_SUFFIXES, True)
sys.path_hooks.append(importlib.machinery.FileFinder.path_hook(loader))
py_compile.compile(mapping[name])
assert os.path.exists(imp.cache_from_source(mapping[name]))
diff --git a/Lib/importlib/test/extension/util.py b/Lib/importlib/test/extension/util.py
index d149169..a266dd9 100644
--- a/Lib/importlib/test/extension/util.py
+++ b/Lib/importlib/test/extension/util.py
@@ -1,4 +1,5 @@
import imp
+from importlib import machinery
import os
import sys
@@ -6,10 +7,9 @@
EXT = None
FILENAME = None
NAME = '_testcapi'
-_file_exts = [x[0] for x in imp.get_suffixes() if x[2] == imp.C_EXTENSION]
try:
for PATH in sys.path:
- for EXT in _file_exts:
+ for EXT in machinery.EXTENSION_SUFFIXES:
FILENAME = NAME + EXT
FILEPATH = os.path.join(PATH, FILENAME)
if os.path.exists(os.path.join(PATH, FILENAME)):
@@ -18,4 +18,3 @@
PATH = EXT = FILENAME = FILEPATH = None
except StopIteration:
pass
-del _file_exts
diff --git a/Lib/importlib/test/source/test_case_sensitivity.py b/Lib/importlib/test/source/test_case_sensitivity.py
index fade25f..21a4378 100644
--- a/Lib/importlib/test/source/test_case_sensitivity.py
+++ b/Lib/importlib/test/source/test_case_sensitivity.py
@@ -1,5 +1,6 @@
"""Test case-sensitivity (PEP 235)."""
from importlib import _bootstrap
+from importlib import machinery
from .. import util
from . import util as source_util
import imp
@@ -20,12 +21,12 @@
assert name != name.lower()
def find(self, path):
- finder = _bootstrap.FileFinder(path,
- (_bootstrap.SourceFileLoader,
- _bootstrap._SOURCE_SUFFIXES,
+ finder = machinery.FileFinder(path,
+ (machinery.SourceFileLoader,
+ machinery.SOURCE_SUFFIXES,
True),
- (_bootstrap.SourcelessFileLoader,
- [_bootstrap._BYTECODE_SUFFIX],
+ (machinery.SourcelessFileLoader,
+ machinery.BYTECODE_SUFFIXES,
True))
return finder.find_module(self.name)
diff --git a/Lib/importlib/test/source/test_finder.py b/Lib/importlib/test/source/test_finder.py
index 45b804f..bbe0163 100644
--- a/Lib/importlib/test/source/test_finder.py
+++ b/Lib/importlib/test/source/test_finder.py
@@ -1,7 +1,7 @@
from .. import abc
from . import util as source_util
-from importlib import _bootstrap
+from importlib import machinery
import errno
import imp
import os
@@ -36,11 +36,11 @@
"""
def import_(self, root, module):
- loader_details = [(_bootstrap.SourceFileLoader,
- _bootstrap._SOURCE_SUFFIXES, True),
- (_bootstrap.SourcelessFileLoader,
- [_bootstrap._BYTECODE_SUFFIX], True)]
- finder = _bootstrap.FileFinder(root, *loader_details)
+ loader_details = [(machinery.SourceFileLoader,
+ machinery.SOURCE_SUFFIXES, True),
+ (machinery.SourcelessFileLoader,
+ machinery.BYTECODE_SUFFIXES, True)]
+ finder = machinery.FileFinder(root, *loader_details)
return finder.find_module(module)
def run_test(self, test, create=None, *, compile_=None, unlink=None):
@@ -138,8 +138,8 @@
def test_empty_string_for_dir(self):
# The empty string from sys.path means to search in the cwd.
- finder = _bootstrap.FileFinder('', (_bootstrap.SourceFileLoader,
- _bootstrap._SOURCE_SUFFIXES, True))
+ finder = machinery.FileFinder('', (machinery.SourceFileLoader,
+ machinery.SOURCE_SUFFIXES, True))
with open('mod.py', 'w') as file:
file.write("# test file for importlib")
try:
@@ -150,8 +150,8 @@
def test_invalidate_caches(self):
# invalidate_caches() should reset the mtime.
- finder = _bootstrap.FileFinder('', (_bootstrap.SourceFileLoader,
- _bootstrap._SOURCE_SUFFIXES, True))
+ finder = machinery.FileFinder('', (machinery.SourceFileLoader,
+ machinery.SOURCE_SUFFIXES, True))
finder._path_mtime = 42
finder.invalidate_caches()
self.assertEqual(finder._path_mtime, -1)
diff --git a/Lib/importlib/test/source/test_path_hook.py b/Lib/importlib/test/source/test_path_hook.py
index df69b4d..54c0699 100644
--- a/Lib/importlib/test/source/test_path_hook.py
+++ b/Lib/importlib/test/source/test_path_hook.py
@@ -1,6 +1,6 @@
from . import util as source_util
-from importlib import _bootstrap
+from importlib import machinery
import imp
import unittest
@@ -10,8 +10,8 @@
"""Test the path hook for source."""
def path_hook(self):
- return _bootstrap.FileFinder.path_hook((_bootstrap.SourceFileLoader,
- _bootstrap._SOURCE_SUFFIXES, True))
+ return machinery.FileFinder.path_hook((machinery.SourceFileLoader,
+ machinery.SOURCE_SUFFIXES, True))
def test_success(self):
with source_util.create_modules('dummy') as mapping: