Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d05eb00

Browse files
committed
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.
1 parent 831c476 commit d05eb00

2 files changed

Lines changed: 26 additions & 5 deletions

File tree

Lib/_abcoll.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"Mapping", "MutableMapping",
1717
"MappingView", "KeysView", "ItemsView", "ValuesView",
1818
"Sequence", "MutableSequence",
19+
"ByteString",
1920
]
2021

2122
### ONE-TRICK PONIES ###
@@ -489,8 +490,17 @@ def count(self, value):
489490

490491
Sequence.register(tuple)
491492
Sequence.register(str)
492-
Sequence.register(bytes)
493-
Sequence.register(memoryview)
493+
494+
495+
class ByteString(Sequence):
496+
497+
"""This unifies bytes and bytearray.
498+
499+
XXX Should add all their methods.
500+
"""
501+
502+
ByteString.register(bytes)
503+
ByteString.register(bytearray)
494504

495505

496506
class MutableSequence(Sequence):
@@ -531,4 +541,4 @@ def __iadd__(self, values):
531541
self.extend(values)
532542

533543
MutableSequence.register(list)
534-
MutableSequence.register(bytes)
544+
MutableSequence.register(bytearray) # Multiply inheriting, see ByteString

Lib/test/test_collections.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from collections import Set, MutableSet
99
from collections import Mapping, MutableMapping
1010
from collections import Sequence, MutableSequence
11+
from collections import ByteString
1112

1213

1314
class TestNamedTuple(unittest.TestCase):
@@ -260,11 +261,21 @@ def test_Sequence(self):
260261
self.failUnless(issubclass(sample, Sequence))
261262
self.failUnless(issubclass(str, Sequence))
262263

264+
def test_ByteString(self):
265+
for sample in [bytes, bytearray]:
266+
self.failUnless(isinstance(sample(), ByteString))
267+
self.failUnless(issubclass(sample, ByteString))
268+
for sample in [str, list, tuple]:
269+
self.failIf(isinstance(sample(), ByteString))
270+
self.failIf(issubclass(sample, ByteString))
271+
self.failIf(isinstance(memoryview(b""), ByteString))
272+
self.failIf(issubclass(memoryview, ByteString))
273+
263274
def test_MutableSequence(self):
264-
for sample in [tuple, str]:
275+
for sample in [tuple, str, bytes]:
265276
self.failIf(isinstance(sample(), MutableSequence))
266277
self.failIf(issubclass(sample, MutableSequence))
267-
for sample in [list, bytes]:
278+
for sample in [list, bytearray]:
268279
self.failUnless(isinstance(sample(), MutableSequence))
269280
self.failUnless(issubclass(sample, MutableSequence))
270281
self.failIf(issubclass(str, MutableSequence))

0 commit comments

Comments
 (0)