mirror of
https://github.com/python/cpython.git
synced 2025-08-03 00:23:06 +00:00
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.
This commit is contained in:
parent
810c64df8f
commit
cb66eb0dec
17 changed files with 160 additions and 69 deletions
|
@ -163,11 +163,14 @@ def new_module(name):
|
|||
|
||||
_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 @@ def cache_from_source(path, debug_override=None):
|
|||
|
||||
"""
|
||||
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 @@ def _setup(sys_module, _imp_module):
|
|||
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])
|
||||
|
|
|
@ -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 FileFinder
|
|||
from ._bootstrap import SourceFileLoader
|
||||
from ._bootstrap import SourcelessFileLoader
|
||||
from ._bootstrap import ExtensionFileLoader
|
||||
|
||||
EXTENSION_SUFFIXES = _imp.extension_suffixes()
|
||||
|
|
|
@ -9,7 +9,6 @@ from .source import util as source_util
|
|||
import decimal
|
||||
import imp
|
||||
import importlib
|
||||
import importlib._bootstrap
|
||||
import importlib.machinery
|
||||
import json
|
||||
import os
|
||||
|
@ -72,7 +71,7 @@ def source_wo_bytecode(seconds, repeat):
|
|||
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 @@ def source_writing_bytecode(seconds, repeat):
|
|||
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 @@ def source_using_bytecode(seconds, repeat):
|
|||
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]))
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import imp
|
||||
from importlib import machinery
|
||||
import os
|
||||
import sys
|
||||
|
||||
|
@ -6,10 +7,9 @@ PATH = None
|
|||
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 @@ try:
|
|||
PATH = EXT = FILENAME = FILEPATH = None
|
||||
except StopIteration:
|
||||
pass
|
||||
del _file_exts
|
||||
|
|
|
@ -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 @@ class CaseSensitivityTest(unittest.TestCase):
|
|||
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)
|
||||
|
||||
|
|
|
@ -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 @@ class FinderTests(abc.FinderTests):
|
|||
"""
|
||||
|
||||
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 @@ class FinderTests(abc.FinderTests):
|
|||
|
||||
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 @@ class FinderTests(abc.FinderTests):
|
|||
|
||||
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)
|
||||
|
|
|
@ -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 @@ class PathHookTest(unittest.TestCase):
|
|||
"""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:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue