bpo-42136: Deprecate module_repr() as found in importlib (GH-25022)

This commit is contained in:
Brett Cannon 2021-03-26 11:55:07 -07:00 committed by GitHub
parent 21a2cabb37
commit 1899087b21
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 1545 additions and 1478 deletions

View file

@ -675,6 +675,13 @@ Here are the exact rules used:
:meth:`~importlib.abc.Loader.module_repr` method, if defined, before
trying either approach described above. However, the method is deprecated.
.. versionchanged:: 3.10
Calling :meth:`~importlib.abc.Loader.module_repr` now occurs after trying to
use a module's ``__spec__`` attribute but before falling back on
``__file__``. Use of :meth:`~importlib.abc.Loader.module_repr` is slated to
stop in Python 3.12.
.. _pyc-invalidation:
Cached bytecode invalidation

View file

@ -1010,6 +1010,12 @@ Deprecated
for Python 3.12.
(Contributed by Brett Cannon in :issue:`42137`.)
* :meth:`importlib.abc.Loader.module_repr`,
:meth:`importlib.machinery.FrozenLoader.module_repr`, and
:meth:`importlib.machinery.BuiltinLoader.module_repr` are deprecated and
slated for removal in Python 3.12.
(Contributed by Brett Cannon in :issue:`42136`.)
* ``sqlite3.OptimizedUnicode`` has been undocumented and obsolete since Python
3.3, when it was made an alias to :class:`str`. It is now deprecated,
scheduled for removal in Python 3.12.

View file

@ -1,6 +1,7 @@
"""Subset of importlib.abc used to reduce importlib.util imports."""
from . import _bootstrap
import abc
import warnings
class Loader(metaclass=abc.ABCMeta):
@ -47,5 +48,7 @@ class Loader(metaclass=abc.ABCMeta):
This method is deprecated.
"""
warnings.warn("importlib.abc.Loader.module_repr() is deprecated and "
"slated for removal in Python 3.12", DeprecationWarning)
# The exception will cause ModuleType.__repr__ to ignore this method.
raise NotImplementedError

View file

@ -302,8 +302,6 @@ def _module_repr(module):
except Exception:
pass
# Fall through to a catch-all which always succeeds.
# We could use module.__class__.__name__ instead of 'module' in the
# various repr permutations.
try:
name = module.__name__
except AttributeError:
@ -741,6 +739,8 @@ class BuiltinImporter:
The method is deprecated. The import machinery does the job itself.
"""
_warnings.warn("BuiltinImporter.module_repr() is deprecated and "
"slated for removal in Python 3.12", DeprecationWarning)
return f'<module {module.__name__!r} ({BuiltinImporter._ORIGIN})>'
@classmethod
@ -816,6 +816,8 @@ class FrozenImporter:
The method is deprecated. The import machinery does the job itself.
"""
_warnings.warn("FrozenImporter.module_repr() is deprecated and "
"slated for removal in Python 3.12", DeprecationWarning)
return '<module {!r} ({})>'.format(m.__name__, FrozenImporter._ORIGIN)
@classmethod

View file

@ -1230,6 +1230,8 @@ class _NamespaceLoader:
The method is deprecated. The import machinery does the job itself.
"""
_warnings.warn("_NamespaceLoader.module_repr() is deprecated and "
"slated for removal in Python 3.12", DeprecationWarning)
return '<module {!r} (namespace)>'.format(module.__name__)
def is_package(self, fullname):

View file

@ -220,8 +220,10 @@ class LoaderDefaultsTests(ABCTestHarness):
def test_module_repr(self):
mod = types.ModuleType('blah')
with self.assertRaises(NotImplementedError):
self.ins.module_repr(mod)
with warnings.catch_warnings():
warnings.simplefilter("ignore")
with self.assertRaises(NotImplementedError):
self.ins.module_repr(mod)
original_repr = repr(mod)
mod.__loader__ = self.ins
# Should still return a proper repr.

View file

@ -3,6 +3,7 @@ import importlib
import os
import sys
import unittest
import warnings
from test.test_importlib import util
@ -82,8 +83,10 @@ class SingleNamespacePackage(NamespacePackageTest):
def test_module_repr(self):
import foo.one
self.assertEqual(foo.__spec__.loader.module_repr(foo),
"<module 'foo' (namespace)>")
with warnings.catch_warnings():
warnings.simplefilter("ignore")
self.assertEqual(foo.__spec__.loader.module_repr(foo),
"<module 'foo' (namespace)>")
class DynamicPathNamespacePackage(NamespacePackageTest):

View file

@ -7,7 +7,6 @@ import sys
import unittest
from test import support
from test.support import import_helper
from distutils.util import get_platform
from contextlib import contextmanager
from .util import temp_module
@ -18,6 +17,25 @@ from winreg import (
EnumKey, CloseKey, DeleteKey, OpenKey
)
def get_platform():
# Port of distutils.util.get_platform().
TARGET_TO_PLAT = {
'x86' : 'win32',
'x64' : 'win-amd64',
'arm' : 'win-arm32',
}
if ('VSCMD_ARG_TGT_ARCH' in os.environ and
os.environ['VSCMD_ARG_TGT_ARCH'] in TARGET_TO_PLAT):
return TARGET_TO_PLAT[os.environ['VSCMD_ARG_TGT_ARCH']]
elif 'amd64' in sys.version.lower():
return 'win-amd64'
elif '(arm)' in sys.version.lower():
return 'win-arm32'
elif '(arm64)' in sys.version.lower():
return 'win-arm64'
else:
return sys.platform
def delete_registry_tree(root, subkey):
try:
hkey = OpenKey(root, subkey, access=KEY_ALL_ACCESS)
@ -101,7 +119,7 @@ class WindowsExtensionSuffixTests:
self.assertIn(expected_tag, suffixes)
# Ensure the tags are in the correct order
# Ensure the tags are in the correct order.
tagged_i = suffixes.index(expected_tag)
self.assertLess(tagged_i, untagged_i)

View file

@ -0,0 +1,2 @@
Deprecate all module_repr() methods found in importlib as their use is being
phased out by Python 3.12.

1562
Python/importlib.h generated

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff