From 1d4601c2c6952d03fc4dda2b041be9aa8713c0bc Mon Sep 17 00:00:00 2001 From: Matthias Bussonnier Date: Wed, 15 Feb 2017 18:00:32 -0800 Subject: [PATCH] bpo-29576: add explicit deprecation for importlib.abc.find_loader() and find_module() (GH-32) --- Doc/whatsnew/3.7.rst | 11 +++++++++++ Lib/importlib/__init__.py | 3 ++- Lib/importlib/abc.py | 25 +++++++++++++++++++------ Lib/test/test_importlib/test_abc.py | 6 ++++++ Misc/NEWS | 3 +++ 5 files changed, 41 insertions(+), 7 deletions(-) diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst index 81ad4f92455..21621c5ee4e 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -140,6 +140,17 @@ Deprecated ``0x03050400`` and ``0x03060000`` (not including) or ``0x03060100`` or higher. (Contributed by Serhiy Storchaka in :issue:`27867`.) +- Methods + :meth:`MetaPathFinder.find_module() ` + (replaced by + :meth:`MetaPathFinder.find_spec() ` + ) and + :meth:`PathEntryFinder.find_loader() ` + (replaced by + :meth:`PathEntryFinder.find_spec() `) + both deprecated in Python 3.4 now emit :exc:`DeprecationWarning`. (Contributed + by Matthias Bussonnier in :issue:`29576`) + Removed ======= diff --git a/Lib/importlib/__init__.py b/Lib/importlib/__init__.py index b6a9f82e05f..f87e20e4045 100644 --- a/Lib/importlib/__init__.py +++ b/Lib/importlib/__init__.py @@ -79,7 +79,8 @@ def find_loader(name, path=None): This function is deprecated in favor of importlib.util.find_spec(). """ - warnings.warn('Use importlib.util.find_spec() instead.', + warnings.warn('Deprecated since Python 3.4. ' + 'Use importlib.util.find_spec() instead.', DeprecationWarning, stacklevel=2) try: loader = sys.modules[name].__loader__ diff --git a/Lib/importlib/abc.py b/Lib/importlib/abc.py index daff681e696..661bd76e077 100644 --- a/Lib/importlib/abc.py +++ b/Lib/importlib/abc.py @@ -13,6 +13,7 @@ try: except ImportError as exc: _frozen_importlib_external = _bootstrap_external import abc +import warnings def _register(abstract_cls, *classes): @@ -34,6 +35,8 @@ class Finder(metaclass=abc.ABCMeta): reimplementations of the import system. Otherwise, finder implementations should derive from the more specific MetaPathFinder or PathEntryFinder ABCs. + + Deprecated since Python 3.3 """ @abc.abstractmethod @@ -57,11 +60,16 @@ class MetaPathFinder(Finder): If no module is found, return None. The fullname is a str and the path is a list of strings or None. - This method is deprecated in favor of finder.find_spec(). If find_spec() - exists then backwards-compatible functionality is provided for this - method. + This method is deprecated since Python 3.4 in favor of + finder.find_spec(). If find_spec() exists then backwards-compatible + functionality is provided for this method. """ + warnings.warn("MetaPathFinder.find_module() is deprecated since Python " + "3.4 in favor of MetaPathFinder.find_spec()" + "(available since 3.4)", + DeprecationWarning, + stacklevel=2) if not hasattr(self, 'find_spec'): return None found = self.find_spec(fullname, path) @@ -94,10 +102,15 @@ class PathEntryFinder(Finder): The portion will be discarded if another path entry finder locates the module as a normal module or package. - This method is deprecated in favor of finder.find_spec(). If find_spec() - is provided than backwards-compatible functionality is provided. - + This method is deprecated since Python 3.4 in favor of + finder.find_spec(). If find_spec() is provided than backwards-compatible + functionality is provided. """ + warnings.warn("PathEntryFinder.find_loader() is deprecated since Python " + "3.4 in favor of PathEntryFinder.find_spec() " + "(available since 3.4)", + DeprecationWarning, + stacklevel=2) if not hasattr(self, 'find_spec'): return None, [] found = self.find_spec(fullname) diff --git a/Lib/test/test_importlib/test_abc.py b/Lib/test/test_importlib/test_abc.py index 4c090f32de3..db36204e3b4 100644 --- a/Lib/test/test_importlib/test_abc.py +++ b/Lib/test/test_importlib/test_abc.py @@ -163,6 +163,9 @@ class MetaPathFinderDefaultsTests(ABCTestHarness): # Calling the method is a no-op. self.ins.invalidate_caches() + def test_find_module_warns(self): + with self.assertWarns(DeprecationWarning): + self.ins.find_module('something', None) (Frozen_MPFDefaultTests, Source_MPFDefaultTests @@ -189,6 +192,9 @@ class PathEntryFinderDefaultsTests(ABCTestHarness): # Should be a no-op. self.ins.invalidate_caches() + def test_find_loader_warns(self): + with self.assertWarns(DeprecationWarning): + self.ins.find_loader('something') (Frozen_PEFDefaultTests, Source_PEFDefaultTests diff --git a/Misc/NEWS b/Misc/NEWS index 51055ef6f6f..1422627b905 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -229,6 +229,9 @@ Extension Modules Library ------- +- bpo-29576: Improve some deprecations in importlib. Some deprecated methods + now emit DeprecationWarnings and have better descriptive messages. + - bpo-29534: Fixed different behaviour of Decimal.from_float() for _decimal and _pydecimal. Thanks Andrew Nester.