mirror of https://github.com/python/cpython
SF patch #1669633, add methods for bytes from Pete Shinners.
This commit is contained in:
parent
fa04e1a090
commit
6968b056ef
|
@ -122,6 +122,7 @@ PyAPI_FUNC(void) _PyImportHooks_Init(void);
|
|||
PyAPI_FUNC(int) _PyFrame_Init(void);
|
||||
PyAPI_FUNC(int) _PyInt_Init(void);
|
||||
PyAPI_FUNC(void) _PyFloat_Init(void);
|
||||
PyAPI_FUNC(int) PyBytes_Init(void);
|
||||
|
||||
/* Various internal finalizers */
|
||||
PyAPI_FUNC(void) _PyExc_Fini(void);
|
||||
|
@ -133,6 +134,7 @@ PyAPI_FUNC(void) PyTuple_Fini(void);
|
|||
PyAPI_FUNC(void) PyList_Fini(void);
|
||||
PyAPI_FUNC(void) PySet_Fini(void);
|
||||
PyAPI_FUNC(void) PyString_Fini(void);
|
||||
PyAPI_FUNC(void) PyBytes_Fini(void);
|
||||
PyAPI_FUNC(void) PyInt_Fini(void);
|
||||
PyAPI_FUNC(void) PyFloat_Fini(void);
|
||||
PyAPI_FUNC(void) PyOS_FiniInterrupts(void);
|
||||
|
|
|
@ -145,6 +145,17 @@ class BytesTest(unittest.TestCase):
|
|||
input.reverse()
|
||||
self.assertEqual(output, input)
|
||||
|
||||
def test_reverse(self):
|
||||
b = b'hello'
|
||||
self.assertEqual(b.reverse(), None)
|
||||
self.assertEqual(b, b'olleh')
|
||||
b = b'hello1' # test even number of items
|
||||
b.reverse()
|
||||
self.assertEqual(b, b'1olleh')
|
||||
b = bytes()
|
||||
b.reverse()
|
||||
self.assertFalse(b)
|
||||
|
||||
def test_getslice(self):
|
||||
def by(s):
|
||||
return bytes(map(ord, s))
|
||||
|
@ -434,36 +445,171 @@ class BytesTest(unittest.TestCase):
|
|||
self.assertRaises(SyntaxError, eval,
|
||||
'b"%s"' % chr(c))
|
||||
|
||||
def test_extend(self):
|
||||
orig = b'hello'
|
||||
a = bytes(orig)
|
||||
a.extend(a)
|
||||
self.assertEqual(a, orig + orig)
|
||||
self.assertEqual(a[5:], orig)
|
||||
|
||||
def test_remove(self):
|
||||
b = b'hello'
|
||||
b.remove(ord('l'))
|
||||
self.assertEqual(b, b'helo')
|
||||
b.remove(ord('l'))
|
||||
self.assertEqual(b, b'heo')
|
||||
self.assertRaises(ValueError, lambda: b.remove(ord('l')))
|
||||
self.assertRaises(ValueError, lambda: b.remove(400))
|
||||
self.assertRaises(ValueError, lambda: b.remove('e'))
|
||||
# remove first and last
|
||||
b.remove(ord('o'))
|
||||
b.remove(ord('h'))
|
||||
self.assertEqual(b, b'e')
|
||||
|
||||
def test_pop(self):
|
||||
b = b'world'
|
||||
self.assertEqual(b.pop(), ord('d'))
|
||||
self.assertEqual(b.pop(0), ord('w'))
|
||||
self.assertEqual(b.pop(-2), ord('r'))
|
||||
self.assertRaises(IndexError, lambda: b.pop(10))
|
||||
self.assertRaises(OverflowError, lambda: bytes().pop())
|
||||
|
||||
def test_nosort(self):
|
||||
self.assertRaises(AttributeError, lambda: bytes().sort())
|
||||
|
||||
def test_index(self):
|
||||
b = b'parrot'
|
||||
self.assertEqual(b.index('p'), 0)
|
||||
self.assertEqual(b.index('rr'), 2)
|
||||
self.assertEqual(b.index('t'), 5)
|
||||
self.assertRaises(ValueError, lambda: b.index('w'))
|
||||
|
||||
def test_count(self):
|
||||
b = b'mississippi'
|
||||
self.assertEqual(b.count('i'), 4)
|
||||
self.assertEqual(b.count('ss'), 2)
|
||||
self.assertEqual(b.count('w'), 0)
|
||||
|
||||
def test_append(self):
|
||||
b = b'hell'
|
||||
b.append(ord('o'))
|
||||
self.assertEqual(b, b'hello')
|
||||
self.assertEqual(b.append(100), None)
|
||||
b = bytes()
|
||||
b.append(ord('A'))
|
||||
self.assertEqual(len(b), 1)
|
||||
|
||||
def test_insert(self):
|
||||
b = b'msssspp'
|
||||
b.insert(1, ord('i'))
|
||||
b.insert(4, ord('i'))
|
||||
b.insert(-2, ord('i'))
|
||||
b.insert(1000, ord('i'))
|
||||
self.assertEqual(b, b'mississippi')
|
||||
|
||||
def test_startswith(self):
|
||||
b = b'hello'
|
||||
self.assertFalse(bytes().startswith("anything"))
|
||||
self.assertTrue(b.startswith("hello"))
|
||||
self.assertTrue(b.startswith("hel"))
|
||||
self.assertTrue(b.startswith("h"))
|
||||
self.assertFalse(b.startswith("hellow"))
|
||||
self.assertFalse(b.startswith("ha"))
|
||||
|
||||
def test_endswith(self):
|
||||
b = b'hello'
|
||||
self.assertFalse(bytes().endswith("anything"))
|
||||
self.assertTrue(b.endswith("hello"))
|
||||
self.assertTrue(b.endswith("llo"))
|
||||
self.assertTrue(b.endswith("o"))
|
||||
self.assertFalse(b.endswith("whello"))
|
||||
self.assertFalse(b.endswith("no"))
|
||||
|
||||
def test_find(self):
|
||||
b = b'mississippi'
|
||||
self.assertEqual(b.find('ss'), 2)
|
||||
self.assertEqual(b.find('ss', 3), 5)
|
||||
self.assertEqual(b.find('ss', 1, 7), 2)
|
||||
self.assertEqual(b.find('ss', 1, 3), -1)
|
||||
self.assertEqual(b.find('w'), -1)
|
||||
self.assertEqual(b.find('mississippian'), -1)
|
||||
|
||||
def test_rfind(self):
|
||||
b = b'mississippi'
|
||||
self.assertEqual(b.rfind('ss'), 5)
|
||||
self.assertEqual(b.rfind('ss', 3), 5)
|
||||
self.assertEqual(b.rfind('ss', 0, 6), 2)
|
||||
self.assertEqual(b.rfind('w'), -1)
|
||||
self.assertEqual(b.rfind('mississippian'), -1)
|
||||
|
||||
def test_index(self):
|
||||
b = b'world'
|
||||
self.assertEqual(b.index('w'), 0)
|
||||
self.assertEqual(b.index('orl'), 1)
|
||||
self.assertRaises(ValueError, lambda: b.index('worm'))
|
||||
self.assertRaises(ValueError, lambda: b.index('ldo'))
|
||||
|
||||
def test_rindex(self):
|
||||
# XXX could be more rigorous
|
||||
b = b'world'
|
||||
self.assertEqual(b.rindex('w'), 0)
|
||||
self.assertEqual(b.rindex('orl'), 1)
|
||||
self.assertRaises(ValueError, lambda: b.rindex('worm'))
|
||||
self.assertRaises(ValueError, lambda: b.rindex('ldo'))
|
||||
|
||||
def test_replace(self):
|
||||
b = b'mississippi'
|
||||
self.assertEqual(b.replace('i', 'a'), b'massassappa')
|
||||
self.assertEqual(b.replace('ss', 'x'), b'mixixippi')
|
||||
|
||||
def test_translate(self):
|
||||
b = b'hello'
|
||||
rosetta = bytes(range(0, 256))
|
||||
rosetta[ord('o')] = ord('e')
|
||||
c = b.translate(rosetta, b'l')
|
||||
self.assertEqual(b, b'hello')
|
||||
self.assertEqual(c, b'hee')
|
||||
|
||||
def test_split(self):
|
||||
b = b'mississippi'
|
||||
self.assertEqual(b.split('i'), [b'm', b'ss', b'ss', b'pp', b''])
|
||||
self.assertEqual(b.split('ss'), [b'mi', b'i', b'ippi'])
|
||||
self.assertEqual(b.split('w'), [b])
|
||||
# require an arg (no magic whitespace split)
|
||||
self.assertRaises(TypeError, lambda: b.split())
|
||||
|
||||
def test_rsplit(self):
|
||||
b = b'mississippi'
|
||||
self.assertEqual(b.rsplit('i'), [b'm', b'ss', b'ss', b'pp', b''])
|
||||
self.assertEqual(b.rsplit('ss'), [b'mi', b'i', b'ippi'])
|
||||
self.assertEqual(b.rsplit('w'), [b])
|
||||
# require an arg (no magic whitespace split)
|
||||
self.assertRaises(TypeError, lambda: b.rsplit())
|
||||
|
||||
def test_partition(self):
|
||||
b = b'mississippi'
|
||||
self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
|
||||
self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
|
||||
|
||||
def test_rpartition(self):
|
||||
b = b'mississippi'
|
||||
self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
|
||||
self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
|
||||
|
||||
# Optimizations:
|
||||
# __iter__? (optimization)
|
||||
# __reversed__? (optimization)
|
||||
|
||||
# XXX Some list methods?
|
||||
# extended slicing
|
||||
# extended slice assignment
|
||||
# extend (same as b[len(b):] = src)
|
||||
# reverse (in-place)
|
||||
# remove
|
||||
# pop
|
||||
# NOT sort!
|
||||
# With int arg:
|
||||
# index
|
||||
# count
|
||||
# append
|
||||
# insert
|
||||
|
||||
# XXX Some string methods? (Those that don't use character properties)
|
||||
# startswith
|
||||
# endswidth
|
||||
# find, rfind
|
||||
# index, rindex (bytes arg)
|
||||
# lstrip, rstrip, strip?? (currently un-pepped)
|
||||
# join
|
||||
# replace
|
||||
# translate
|
||||
# split, rsplit
|
||||
# lstrip, rstrip, strip??
|
||||
|
||||
# XXX pickle and marshal support?
|
||||
|
||||
# There are tests in string_tests.py that are more
|
||||
# comprehensive for things like split, partition, etc.
|
||||
# Unfortunately they are all bundled with tests that
|
||||
# are not appropriate for bytes
|
||||
|
||||
|
||||
def test_main():
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -186,6 +186,9 @@ Py_InitializeEx(int install_sigs)
|
|||
if (!_PyLong_Init())
|
||||
Py_FatalError("Py_Initialize: can't init longs");
|
||||
|
||||
if (!PyBytes_Init())
|
||||
Py_FatalError("Py_Initialize: can't init bytes");
|
||||
|
||||
_PyFloat_Init();
|
||||
|
||||
interp->modules = PyDict_New();
|
||||
|
@ -457,6 +460,7 @@ Py_Finalize(void)
|
|||
PyList_Fini();
|
||||
PySet_Fini();
|
||||
PyString_Fini();
|
||||
PyBytes_Fini();
|
||||
PyLong_Fini();
|
||||
PyFloat_Fini();
|
||||
|
||||
|
|
Loading…
Reference in New Issue