cpython (3.5): Issue #25766: Special method __bytes__() now works in str subclasses.
https://hg.python.org/cpython/rev/1e54adef4064 changeset: 99643:1e54adef4064 branch: 3.5 parent: 99640:5895cb9fc8d0 user: Serhiy Storchaka <storchaka@gmail.com> date: Sun Dec 20 16:36:34 2015 +0200 summary: Issue #25766: Special method __bytes__() now works in str subclasses. files: Lib/test/test_bytes.py | 6 ++++++ Misc/NEWS | 2 ++ Objects/bytesobject.c | 18 ++++++++++++------ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -779,6 +779,12 @@ def __index__(self): return 42 self.assertEqual(bytes(A()), b'a') + # Issue #25766 + class A(str): + def __bytes__(self): + return b'abc' + self.assertEqual(bytes(A('\u20ac')), b'abc') + self.assertEqual(bytes(A('\u20ac'), 'iso8859-15'), b'\xa4') # Issue #24731 class A: def __bytes__(self): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ Core and Builtins ----------------- +- Issue #25766: Special method __bytes__() now works in str subclasses. + - Issue #25421: __sizeof__ methods of builtin types now use dynamic basic size. This allows sys.getsize() to work correctly with their subclasses with __slots__ defined. diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -3175,11 +3175,11 @@ return PyBytes_FromStringAndSize(NULL, 0); } - if (PyUnicode_Check(x)) { + if (encoding != NULL) { /* Encode via the codec registry */ - if (encoding == NULL) { + if (!PyUnicode_Check(x)) { PyErr_SetString(PyExc_TypeError, - "string argument without an encoding"); + "encoding without a string argument"); return NULL; } new = PyUnicode_AsEncodedString(x, encoding, errors); @@ -3189,10 +3189,11 @@ return new; } - /* If it's not unicode, there can't be encoding or errors */ - if (encoding != NULL || errors != NULL) { + if (errors != NULL) { PyErr_SetString(PyExc_TypeError, - "encoding or errors without a string argument"); + PyUnicode_Check(x) ? + "string argument without an encoding" : + "errors without a string argument"); return NULL; } @@ -3217,6 +3218,11 @@ else if (PyErr_Occurred()) return NULL; + if (PyUnicode_Check(x)) { + PyErr_SetString(PyExc_TypeError, + "string argument without an encoding"); + return NULL; + } /* Is it an integer? */ size = PyNumber_AsSsize_t(x, PyExc_OverflowError); if (size == -1 && PyErr_Occurred()) { -- Repository URL: https://hg.python.org/cpython
participants (1)
-
serhiy.storchaka