]> granicus.if.org Git - python/commitdiff
Make it an error to compare a bytes object and a Unicode object.
authorJeremy Hylton <jeremy@alum.mit.edu>
Wed, 29 Aug 2007 18:47:16 +0000 (18:47 +0000)
committerJeremy Hylton <jeremy@alum.mit.edu>
Wed, 29 Aug 2007 18:47:16 +0000 (18:47 +0000)
Lib/test/test_bytes.py
Objects/bytesobject.c

index b7e68008d13f75fb05bdbd64d2eadc2f5bdde222..1c161bb0b63cdc93875f844e0f15452221cdaf49 100644 (file)
@@ -130,12 +130,12 @@ class BytesTest(unittest.TestCase):
         self.assertEqual(str8("abc") < b"ab", False)
         self.assertEqual(str8("abc") <= b"ab", False)
 
-        # Bytes should never compare equal to Unicode!
+        # Bytes can't be compared to Unicode!
         # Test this for all expected byte orders and Unicode character sizes
-        self.assertEqual(b"\0a\0b\0c" == "abc", False)
-        self.assertEqual(b"\0\0\0a\0\0\0b\0\0\0c" == "abc", False)
-        self.assertEqual(b"a\0b\0c\0" == "abc", False)
-        self.assertEqual(b"a\0\0\0b\0\0\0c\0\0\0" == "abc", False)
+        self.assertRaises(TypeError, lambda: b"\0a\0b\0c" == "abc")
+        self.assertRaises(TypeError, lambda: b"\0\0\0a\0\0\0b\0\0\0c" == "abc")
+        self.assertRaises(TypeError, lambda: b"a\0b\0c\0" == "abc")
+        self.assertRaises(TypeError, lambda: b"a\0\0\0b\0\0\0c\0\0\0" == "abc")
 
     def test_nohash(self):
         self.assertRaises(TypeError, hash, bytes())
index b267cac11185cf8c0cc3e49ac8b7004e23d4a57f..c13269262f4ba19dea535f0594d4f8bab00ba8a3 100644 (file)
@@ -959,8 +959,14 @@ bytes_richcompare(PyObject *self, PyObject *other, int op)
     Py_ssize_t minsize;
     int cmp;
 
-    /* Bytes can be compared to anything that supports the (binary) buffer
-       API.  Except Unicode. */
+    /* Bytes can be compared to anything that supports the (binary)
+       buffer API.  Except that a comparison with Unicode is always an
+       error, even if the comparison is for equality. */
+    if (PyObject_IsInstance(self, (PyObject*)&PyUnicode_Type) ||
+        PyObject_IsInstance(other, (PyObject*)&PyUnicode_Type)) {
+            PyErr_SetString(PyExc_TypeError, "can't compare bytes and str");
+            return NULL;
+    }
 
     self_size = _getbuffer(self, &self_bytes);
     if (self_size < 0) {