]> granicus.if.org Git - python/commitdiff
bpo-30143: 2to3 now generates a code that uses abstract collection classes (#1262)
authorSerhiy Storchaka <storchaka@gmail.com>
Thu, 16 Nov 2017 07:16:24 +0000 (09:16 +0200)
committerGitHub <noreply@github.com>
Thu, 16 Nov 2017 07:16:24 +0000 (09:16 +0200)
from collections.abc rather than collections.

Doc/library/2to3.rst
Lib/lib2to3/fixes/fix_operator.py
Lib/lib2to3/tests/test_fixers.py
Misc/NEWS.d/next/Library/2017-10-12-19-05-54.bpo-30143.25_hU1.rst [new file with mode: 0644]

index 1ab05a62ad458fbbf38a56fd11e1fbaf0b443474..faf06d91c3d08f80cd085013923b52bc172e9692 100644 (file)
@@ -345,20 +345,20 @@ and off individually.  They are described here in more detail.
 
    Converts calls to various functions in the :mod:`operator` module to other,
    but equivalent, function calls.  When needed, the appropriate ``import``
-   statements are added, e.g. ``import collections``.  The following mapping
+   statements are added, e.g. ``import collections.abc``.  The following mapping
    are made:
 
-   ==================================  ==========================================
+   ==================================  =============================================
    From                                To
-   ==================================  ==========================================
+   ==================================  =============================================
    ``operator.isCallable(obj)``        ``hasattr(obj, '__call__')``
    ``operator.sequenceIncludes(obj)``  ``operator.contains(obj)``
-   ``operator.isSequenceType(obj)``    ``isinstance(obj, collections.Sequence)``
-   ``operator.isMappingType(obj)``     ``isinstance(obj, collections.Mapping)``
+   ``operator.isSequenceType(obj)``    ``isinstance(obj, collections.abc.Sequence)``
+   ``operator.isMappingType(obj)``     ``isinstance(obj, collections.abc.Mapping)``
    ``operator.isNumberType(obj)``      ``isinstance(obj, numbers.Number)``
    ``operator.repeat(obj, n)``         ``operator.mul(obj, n)``
    ``operator.irepeat(obj, n)``        ``operator.imul(obj, n)``
-   ==================================  ==========================================
+   ==================================  =============================================
 
 .. 2to3fixer:: paren
 
index 592444e2580451ea70ac99dbed63566fec86d0e6..0d82454023fe8037cde2a3aef1c7995575633f99 100644 (file)
@@ -2,8 +2,8 @@
 
 operator.isCallable(obj)       -> hasattr(obj, '__call__')
 operator.sequenceIncludes(obj) -> operator.contains(obj)
-operator.isSequenceType(obj)   -> isinstance(obj, collections.Sequence)
-operator.isMappingType(obj)    -> isinstance(obj, collections.Mapping)
+operator.isSequenceType(obj)   -> isinstance(obj, collections.abc.Sequence)
+operator.isMappingType(obj)    -> isinstance(obj, collections.abc.Mapping)
 operator.isNumberType(obj)     -> isinstance(obj, numbers.Number)
 operator.repeat(obj, n)        -> operator.mul(obj, n)
 operator.irepeat(obj, n)       -> operator.imul(obj, n)
@@ -63,13 +63,13 @@ class FixOperator(fixer_base.BaseFix):
     def _irepeat(self, node, results):
         return self._handle_rename(node, results, "imul")
 
-    @invocation("isinstance(%s, collections.Sequence)")
+    @invocation("isinstance(%s, collections.abc.Sequence)")
     def _isSequenceType(self, node, results):
-        return self._handle_type2abc(node, results, "collections", "Sequence")
+        return self._handle_type2abc(node, results, "collections.abc", "Sequence")
 
-    @invocation("isinstance(%s, collections.Mapping)")
+    @invocation("isinstance(%s, collections.abc.Mapping)")
     def _isMappingType(self, node, results):
-        return self._handle_type2abc(node, results, "collections", "Mapping")
+        return self._handle_type2abc(node, results, "collections.abc", "Mapping")
 
     @invocation("isinstance(%s, numbers.Number)")
     def _isNumberType(self, node, results):
index 3e1a255737ec4bab3fbb6a5569563bd3ffeddcf3..e50b7dadae8b7fc8ff0732bdc206588cab6b2689 100644 (file)
@@ -4427,12 +4427,12 @@ class Test_operator(FixerTestCase):
 
     def test_operator_isSequenceType(self):
         b = "operator.isSequenceType(x)"
-        a = "import collections\nisinstance(x, collections.Sequence)"
+        a = "import collections.abc\nisinstance(x, collections.abc.Sequence)"
         self.check(b, a)
 
     def test_operator_isMappingType(self):
         b = "operator.isMappingType(x)"
-        a = "import collections\nisinstance(x, collections.Mapping)"
+        a = "import collections.abc\nisinstance(x, collections.abc.Mapping)"
         self.check(b, a)
 
     def test_operator_isNumberType(self):
@@ -4478,12 +4478,12 @@ class Test_operator(FixerTestCase):
 
     def test_bare_operator_isSequenceType(self):
         s = "isSequenceType(z)"
-        t = "You should use 'isinstance(z, collections.Sequence)' here."
+        t = "You should use 'isinstance(z, collections.abc.Sequence)' here."
         self.warns_unchanged(s, t)
 
     def test_bare_operator_isMappingType(self):
         s = "isMappingType(x)"
-        t = "You should use 'isinstance(x, collections.Mapping)' here."
+        t = "You should use 'isinstance(x, collections.abc.Mapping)' here."
         self.warns_unchanged(s, t)
 
     def test_bare_operator_isNumberType(self):
diff --git a/Misc/NEWS.d/next/Library/2017-10-12-19-05-54.bpo-30143.25_hU1.rst b/Misc/NEWS.d/next/Library/2017-10-12-19-05-54.bpo-30143.25_hU1.rst
new file mode 100644 (file)
index 0000000..a1f8312
--- /dev/null
@@ -0,0 +1,2 @@
+2to3 now generates a code that uses abstract collection classes from
+collections.abc rather than collections.