]> granicus.if.org Git - python/commitdiff
Add ABC ByteString which unifies bytes and bytearray (but not memoryview).
authorGuido van Rossum <guido@python.org>
Wed, 21 Nov 2007 22:26:24 +0000 (22:26 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 21 Nov 2007 22:26:24 +0000 (22:26 +0000)
There's no ABC for "PEP 3118 style buffer API objects" because there's no
way to recognize these in Python (apart from trying to use memoryview()
on them).
Note that array.array really should be registered as a MutableSequence
but that would require importing it whenever collections is imported.

Lib/_abcoll.py
Lib/test/test_collections.py

index ec3e2f838cff876ca7c7021578446bcc43680d4c..6363de9bb7a6f69f486bd9e3b2709ce5d24bc91b 100644 (file)
@@ -16,6 +16,7 @@ __all__ = ["Hashable", "Iterable", "Iterator",
            "Mapping", "MutableMapping",
            "MappingView", "KeysView", "ItemsView", "ValuesView",
            "Sequence", "MutableSequence",
+           "ByteString",
            ]
 
 ### ONE-TRICK PONIES ###
@@ -489,8 +490,17 @@ class Sequence(metaclass=ABCMeta):
 
 Sequence.register(tuple)
 Sequence.register(str)
-Sequence.register(bytes)
-Sequence.register(memoryview)
+
+
+class ByteString(Sequence):
+
+    """This unifies bytes and bytearray.
+
+    XXX Should add all their methods.
+    """
+
+ByteString.register(bytes)
+ByteString.register(bytearray)
 
 
 class MutableSequence(Sequence):
@@ -531,4 +541,4 @@ class MutableSequence(Sequence):
         self.extend(values)
 
 MutableSequence.register(list)
-MutableSequence.register(bytes)
+MutableSequence.register(bytearray)  # Multiply inheriting, see ByteString
index 3ccc06ca13c626e58e67240cb71f92ab98484a5d..62da9c5c3fe118d42e4df488e62bbfef6f76553b 100644 (file)
@@ -8,6 +8,7 @@ from collections import Sized, Container, Callable
 from collections import Set, MutableSet
 from collections import Mapping, MutableMapping
 from collections import Sequence, MutableSequence
+from collections import ByteString
 
 
 class TestNamedTuple(unittest.TestCase):
@@ -260,11 +261,21 @@ class TestCollectionABCs(unittest.TestCase):
             self.failUnless(issubclass(sample, Sequence))
         self.failUnless(issubclass(str, Sequence))
 
+    def test_ByteString(self):
+        for sample in [bytes, bytearray]:
+            self.failUnless(isinstance(sample(), ByteString))
+            self.failUnless(issubclass(sample, ByteString))
+        for sample in [str, list, tuple]:
+            self.failIf(isinstance(sample(), ByteString))
+            self.failIf(issubclass(sample, ByteString))
+        self.failIf(isinstance(memoryview(b""), ByteString))
+        self.failIf(issubclass(memoryview, ByteString))
+
     def test_MutableSequence(self):
-        for sample in [tuple, str]:
+        for sample in [tuple, str, bytes]:
             self.failIf(isinstance(sample(), MutableSequence))
             self.failIf(issubclass(sample, MutableSequence))
-        for sample in [list, bytes]:
+        for sample in [list, bytearray]:
             self.failUnless(isinstance(sample(), MutableSequence))
             self.failUnless(issubclass(sample, MutableSequence))
         self.failIf(issubclass(str, MutableSequence))