cpython: 536fccc75f5a (original) (raw)
Mercurial > cpython
changeset 71543:536fccc75f5a
Issue #12380: PyArg_ParseTuple now accepts a bytearray for the 'c' format. As a side effect, this now allows the rjust, ljust and center methods of bytes and bytearray to accept a bytearray argument. Patch by Petri Lehtinen [#12380]
Eli Bendersky eliben@gmail.com | |
---|---|
date | Fri, 29 Jul 2011 07:05:08 +0300 |
parents | ccce01988603 |
children | 80a3bf889cf6 |
files | Doc/c-api/arg.rst Lib/test/test_bytes.py Lib/test/test_getargs2.py Misc/NEWS Modules/_testcapimodule.c Python/getargs.c |
diffstat | 6 files changed, 53 insertions(+), 4 deletions(-)[+] [-] Doc/c-api/arg.rst 8 Lib/test/test_bytes.py 21 Lib/test/test_getargs2.py 9 Misc/NEWS 7 Modules/_testcapimodule.c 10 Python/getargs.c 2 |
line wrap: on
line diff
--- a/Doc/c-api/arg.rst
+++ b/Doc/c-api/arg.rst
@@ -260,9 +260,11 @@ Numbers
n
(:class:int
) [Py_ssize_t]
Convert a Python integer to a C :c:type:Py_ssize_t
.
-c
(:class:bytes
of length 1) [char]
- Convert a Python byte, represented as a :class:
bytes
object of length 1, - to a C :c:type:
char
. +c
(:class:bytes
or :class:bytearray
of length 1) [char]
- Convert a Python byte, represented as a :class:
bytes
or - :class:
bytearray
object of length 1, to a C :c:type:char
. + - .. versionchanged:: 3.3 Allow :class:
bytearray
objects
C
(:class:str
of length 1) [int]
Convert a Python character, represented as a :class:str
object of
--- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -475,6 +475,27 @@ class BaseBytesTest(unittest.TestCase): self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'b') self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'b')
- def test_center(self):
# Fill character can be either bytes or bytearray (issue 12380)[](#l2.8)
b = self.type2test(b'abc')[](#l2.9)
for fill_type in (bytes, bytearray):[](#l2.10)
self.assertEqual(b.center(7, fill_type(b'-')),[](#l2.11)
self.type2test(b'--abc--'))[](#l2.12)
- def test_ljust(self):
# Fill character can be either bytes or bytearray (issue 12380)[](#l2.15)
b = self.type2test(b'abc')[](#l2.16)
for fill_type in (bytes, bytearray):[](#l2.17)
self.assertEqual(b.ljust(7, fill_type(b'-')),[](#l2.18)
self.type2test(b'abc----'))[](#l2.19)
- def test_rjust(self):
# Fill character can be either bytes or bytearray (issue 12380)[](#l2.22)
b = self.type2test(b'abc')[](#l2.23)
for fill_type in (bytes, bytearray):[](#l2.24)
self.assertEqual(b.rjust(7, fill_type(b'-')),[](#l2.25)
self.type2test(b'----abc'))[](#l2.26)
+ def test_ord(self): b = self.type2test(b'\0A\x7f\x80\xff') self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
--- a/Lib/test/test_getargs2.py +++ b/Lib/test/test_getargs2.py @@ -294,6 +294,15 @@ class Keywords_TestCase(unittest.TestCas self.fail('TypeError should have been raised') class Bytes_TestCase(unittest.TestCase):
- def test_c(self):
from _testcapi import getargs_c[](#l3.8)
self.assertRaises(TypeError, getargs_c, b'abc') # len > 1[](#l3.9)
self.assertEqual(getargs_c(b'a'), b'a')[](#l3.10)
self.assertEqual(getargs_c(bytearray(b'a')), b'a')[](#l3.11)
self.assertRaises(TypeError, getargs_c, memoryview(b'a'))[](#l3.12)
self.assertRaises(TypeError, getargs_c, 's')[](#l3.13)
self.assertRaises(TypeError, getargs_c, None)[](#l3.14)
+ def test_s(self): from _testcapi import getargs_s self.assertEqual(getargs_s('abc\xe9'), b'abc\xc3\xa9')
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -238,6 +238,9 @@ Core and Builtins
- Issue #11386: bytearray.pop() now throws IndexError when the bytearray is empty, instead of OverflowError. +- Issue #12380: The rjust, ljust and center methods of bytes and bytearray
- Issue #12173: The first argument of PyImport_ImportModuleLevel is now
const[](#l4.14) char *
instead ofchar *
. +- Issue #12380: PyArg_ParseTuple now accepts a bytearray for the 'c' format. + Documentation ------------- @@ -6680,4 +6685,4 @@ Docs ---- -(For information about older versions, consult the HISTORY file.) \ No newline at end of file +(For information about older versions, consult the HISTORY file.)
--- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -1003,6 +1003,15 @@ test_k_code(PyObject *self) } static PyObject * +getargs_c(PyObject *self, PyObject *args) +{
- char c;
- if (!PyArg_ParseTuple(args, "c", &c))
return NULL;[](#l5.11)
- return PyBytes_FromStringAndSize(&c, 1);
+} + +static PyObject * getargs_s(PyObject *self, PyObject *args) { char *str; @@ -2289,6 +2298,7 @@ static PyMethodDef TestMethods[] = { (PyCFunction)test_long_long_and_overflow, METH_NOARGS}, {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS}, #endif
- {"getargs_c", getargs_c, METH_VARARGS}, {"getargs_s", getargs_s, METH_VARARGS}, {"getargs_s_star", getargs_s_star, METH_VARARGS}, {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
--- a/Python/getargs.c +++ b/Python/getargs.c @@ -828,6 +828,8 @@ convertsimple(PyObject *arg, const char char *p = va_arg(*p_va, char *); if (PyBytes_Check(arg) && PyBytes_Size(arg) == 1) *p = PyBytes_AS_STRING(arg)[0];
else if (PyByteArray_Check(arg) && PyByteArray_Size(arg) == 1)[](#l6.7)
*p = PyByteArray_AS_STRING(arg)[0];[](#l6.8) else[](#l6.9) return converterr("a byte string of length 1", arg, msgbuf, bufsize);[](#l6.10) break;[](#l6.11)