Commit d05eb004 authored by Guido van Rossum's avatar Guido van Rossum

Add ABC ByteString which unifies bytes and bytearray (but not memoryview).

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.
parent 831c4761
......@@ -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
......@@ -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))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment