Commit 4b03398f authored by Serhiy Storchaka's avatar Serhiy Storchaka

Issue #23681: The -b option now affects comparisons of bytes with int.

parent e4d25ee6
...@@ -190,9 +190,12 @@ Miscellaneous options ...@@ -190,9 +190,12 @@ Miscellaneous options
.. cmdoption:: -b .. cmdoption:: -b
Issue a warning when comparing str and bytes. Issue an error when the Issue a warning when comparing :class:`bytes` or :class:`bytearray` with
:class:`str` or :class:`bytes` with :class:`int`. Issue an error when the
option is given twice (:option:`-bb`). option is given twice (:option:`-bb`).
.. versionchanged: 3.5
Affects comparisons of :class:`bytes` with :class:`int`.
.. cmdoption:: -B .. cmdoption:: -B
......
...@@ -162,6 +162,8 @@ Some smaller changes made to the core Python language are: ...@@ -162,6 +162,8 @@ Some smaller changes made to the core Python language are:
error handlers now works with decoding and translating. error handlers now works with decoding and translating.
(Contributed by Serhiy Storchaka in :issue:`19676` and :issue:`22286`.) (Contributed by Serhiy Storchaka in :issue:`19676` and :issue:`22286`.)
* The :option:`-b` option now affects comparisons of :class:`bytes` with
:class:`int`. (Contributed by Serhiy Storchaka in :issue:`23681`)
New Modules New Modules
......
...@@ -1338,20 +1338,35 @@ class AssortedBytesTest(unittest.TestCase): ...@@ -1338,20 +1338,35 @@ class AssortedBytesTest(unittest.TestCase):
b = bytearray() b = bytearray()
self.assertFalse(b.replace(b'', b'') is b) self.assertFalse(b.replace(b'', b'') is b)
@unittest.skipUnless(sys.flags.bytes_warning,
"BytesWarning is needed for this test: use -bb option")
def test_compare(self): def test_compare(self):
if sys.flags.bytes_warning:
def bytes_warning(): def bytes_warning():
return test.support.check_warnings(('', BytesWarning)) return test.support.check_warnings(('', BytesWarning))
with bytes_warning(): with bytes_warning():
b'' == '' b'' == ''
with bytes_warning():
'' == b''
with bytes_warning(): with bytes_warning():
b'' != '' b'' != ''
with bytes_warning():
'' != b''
with bytes_warning(): with bytes_warning():
bytearray(b'') == '' bytearray(b'') == ''
with bytes_warning():
'' == bytearray(b'')
with bytes_warning(): with bytes_warning():
bytearray(b'') != '' bytearray(b'') != ''
else: with bytes_warning():
self.skipTest("BytesWarning is needed for this test: use -bb option") '' != bytearray(b'')
with bytes_warning():
b'\0' == 0
with bytes_warning():
0 == b'\0'
with bytes_warning():
b'\0' != 0
with bytes_warning():
0 != b'\0'
# Optimizations: # Optimizations:
# __iter__? (optimization) # __iter__? (optimization)
......
...@@ -10,6 +10,8 @@ Release date: 2015-03-28 ...@@ -10,6 +10,8 @@ Release date: 2015-03-28
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #23681: The -b option now affects comparisons of bytes with int.
- Issue #23632: Memoryviews now allow tuple indexing (including for - Issue #23632: Memoryviews now allow tuple indexing (including for
multi-dimensional memoryviews). multi-dimensional memoryviews).
......
...@@ -1385,15 +1385,24 @@ bytes_richcompare(PyBytesObject *a, PyBytesObject *b, int op) ...@@ -1385,15 +1385,24 @@ bytes_richcompare(PyBytesObject *a, PyBytesObject *b, int op)
/* Make sure both arguments are strings. */ /* Make sure both arguments are strings. */
if (!(PyBytes_Check(a) && PyBytes_Check(b))) { if (!(PyBytes_Check(a) && PyBytes_Check(b))) {
if (Py_BytesWarningFlag && (op == Py_EQ || op == Py_NE) && if (Py_BytesWarningFlag && (op == Py_EQ || op == Py_NE)) {
(PyObject_IsInstance((PyObject*)a, if (PyObject_IsInstance((PyObject*)a,
(PyObject*)&PyUnicode_Type) || (PyObject*)&PyUnicode_Type) ||
PyObject_IsInstance((PyObject*)b, PyObject_IsInstance((PyObject*)b,
(PyObject*)&PyUnicode_Type))) { (PyObject*)&PyUnicode_Type)) {
if (PyErr_WarnEx(PyExc_BytesWarning, if (PyErr_WarnEx(PyExc_BytesWarning,
"Comparison between bytes and string", 1)) "Comparison between bytes and string", 1))
return NULL; return NULL;
} }
else if (PyObject_IsInstance((PyObject*)a,
(PyObject*)&PyLong_Type) ||
PyObject_IsInstance((PyObject*)b,
(PyObject*)&PyLong_Type)) {
if (PyErr_WarnEx(PyExc_BytesWarning,
"Comparison between bytes and int", 1))
return NULL;
}
}
result = Py_NotImplemented; result = Py_NotImplemented;
} }
else if (a == b) { else if (a == b) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment