]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-39674: Revert "bpo-25988: Do not expose abstract collection classes in the collec...
authorVictor Stinner <vstinner@python.org>
Tue, 18 Feb 2020 15:28:53 +0000 (16:28 +0100)
committerGitHub <noreply@github.com>
Tue, 18 Feb 2020 15:28:53 +0000 (16:28 +0100)
This reverts commit ef092fe9905f61ca27889092ca1248a11aa74498.

Update collections __getattr__() and documentation to defer aliases
removal to Python 3.10.

Doc/library/collections.rst
Doc/whatsnew/3.9.rst
Lib/collections/__init__.py
Misc/NEWS.d/next/Library/2020-02-18-12-31-24.bpo-39674.S_zqVM.rst [new file with mode: 0644]

index a5e8d04099b22f9acc0dc58d78466791dd9d6e37..65cdf34aa4e4fe5664a629275a3914ff7c4cf61f 100644 (file)
@@ -33,7 +33,7 @@ Python's general purpose built-in containers, :class:`dict`, :class:`list`,
 :class:`UserString`     wrapper around string objects for easier string subclassing
 =====================   ====================================================================
 
-.. deprecated-removed:: 3.3 3.9
+.. deprecated-removed:: 3.3 3.10
     Moved :ref:`collections-abstract-base-classes` to the :mod:`collections.abc` module.
     For backwards compatibility, they continue to be visible in this module through
     Python 3.8.
index 23f0e4306ee63a9140b77a71936ef7626e380575..f7e279b379f1293fa464ce55ad494151929acc33 100644 (file)
@@ -471,11 +471,6 @@ Removed
   since Python 3.2.
   (Contributed by Victor Stinner in :issue:`38916`.)
 
-* The abstract base classes in :mod:`collections.abc` no longer are
-  exposed in the regular :mod:`collections` module.  This will help
-  create a clearer distinction between the concrete classes and the abstract
-  base classes.
-
 * The undocumented ``sys.callstats()`` function has been removed. Since Python
   3.7, it was deprecated and always returned :const:`None`. It required a special
   build option ``CALL_PROFILE`` which was already removed in Python 3.7.
index cec6c9781a15e05c212dfe4a3f1ca9255cc1fc1d..178cdb1fa5ba099ea5e5c9abaccd6ec628f9106d 100644 (file)
@@ -39,6 +39,21 @@ except ImportError:
     pass
 
 
+def __getattr__(name):
+    # For backwards compatibility, continue to make the collections ABCs
+    # through Python 3.6 available through the collections module.
+    # Note, no new collections ABCs were added in Python 3.7
+    if name in _collections_abc.__all__:
+        obj = getattr(_collections_abc, name)
+        import warnings
+        warnings.warn("Using or importing the ABCs from 'collections' instead "
+                      "of from 'collections.abc' is deprecated since Python 3.3, "
+                      "and in 3.10 it will stop working",
+                      DeprecationWarning, stacklevel=2)
+        globals()[name] = obj
+        return obj
+    raise AttributeError(f'module {__name__!r} has no attribute {name!r}')
+
 ################################################################################
 ### OrderedDict
 ################################################################################
diff --git a/Misc/NEWS.d/next/Library/2020-02-18-12-31-24.bpo-39674.S_zqVM.rst b/Misc/NEWS.d/next/Library/2020-02-18-12-31-24.bpo-39674.S_zqVM.rst
new file mode 100644 (file)
index 0000000..1d0e906
--- /dev/null
@@ -0,0 +1,4 @@
+Revert "Do not expose abstract collection classes in the collections module"
+change (bpo-25988). Aliases to ABC like collections.Mapping are kept in
+Python 3.9 to ease transition from Python 2.7, but will be removed in Python
+3.10.