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:
Brett Cannon 2012-05-11 12:58:42 -04:00
parent 810c64df8f
commit cb66eb0dec
17 changed files with 160 additions and 69 deletions

View file

@ -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])

View file

@ -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()

View file

@ -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]))

View file

@ -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

View file

@ -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)

View file

@ -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)

View file

@ -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: