From: Guido van Rossum Date: Wed, 21 Nov 2007 22:26:24 +0000 (+0000) Subject: Add ABC ByteString which unifies bytes and bytearray (but not memoryview). X-Git-Tag: v3.0a2~123 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d05eb0043e597cf2d5c429d0e554fd39364e36b0;p=thirdparty%2FPython%2Fcpython.git 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. --- diff --git a/Lib/_abcoll.py b/Lib/_abcoll.py index ec3e2f838cff..6363de9bb7a6 100644 --- a/Lib/_abcoll.py +++ b/Lib/_abcoll.py @@ -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 diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index 3ccc06ca13c6..62da9c5c3fe1 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -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))