diff -u b/Objects/bytesobject.c b/Objects/bytesobject.c --- b/Objects/bytesobject.c Mon Jan 20 15:26:06 2014 -0600 +++ b/Objects/bytesobject.c Mon Jan 20 15:26:05 2014 -0600 @@ -1426,6 +1426,48 @@ } static PyObject* +bytes_compatible_compare(PyObject *a, PyObject *b, int op) +{ + PyObject *result; + if (PyBytes_Check(a)) { + a = PyUnicode_FromEncodedObject(a, NULL, "strict"); + if (a == NULL && PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) { + PyErr_Clear(); + goto abort; + } + } + else { + Py_INCREF(a); + } + if (PyBytes_Check(b)) { + b = PyUnicode_FromEncodedObject(b, NULL, "strict"); + if (b == NULL && PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) { + Py_DECREF(a); + PyErr_Clear(); + goto abort; + } + } + else { + Py_INCREF(b); + } + if (PyErr_Warn(PyExc_BytesWarning, + "Comparison between bytes and str") < 0) { + Py_DECREF(a); + Py_DECREF(b); + return NULL; + } + result = PyObject_RichCompare(a, b, op); + Py_DECREF(a); + Py_DECREF(b); + return result; + +abort: + result = Py_NotImplemented; + Py_INCREF(result); + return result; +} + +static PyObject* bytes_richcompare(PyBytesObject *a, PyBytesObject *b, int op) { int c; @@ -1435,15 +1477,17 @@ /* Make sure both arguments are strings. */ if (!(PyBytes_Check(a) && PyBytes_Check(b))) { - if (Py_BytesWarningFlag && (op == Py_EQ || op == Py_NE) && - (PyObject_IsInstance((PyObject*)a, - (PyObject*)&PyUnicode_Type) || - PyObject_IsInstance((PyObject*)b, - (PyObject*)&PyUnicode_Type))) { + int have_str = (PyObject_IsInstance((PyObject*)a, + (PyObject*)&PyUnicode_Type) || + PyObject_IsInstance((PyObject*)b, + (PyObject*)&PyUnicode_Type)); + if (Py_BytesWarningFlag && (op == Py_EQ || op == Py_NE) && have_str) { if (PyErr_WarnEx(PyExc_BytesWarning, "Comparison between bytes and string", 1)) return NULL; } + if (Py_BytesComplatibleFormatFlag) + return bytes_compatible_compare((PyObject *)a, (PyObject *)b, op); result = Py_NotImplemented; } else if (a == b) {