From bb77e6801ea07653e3cc66dbfaa3b5102eae16e7 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 24 Sep 2001 16:51:54 +0000 Subject: [PATCH] Change string comparison so that it applies even when one (or both) arguments are subclasses of str, as long as they don't override rich comparison. --- Lib/test/test_descr.py | 12 ++++++------ Objects/stringobject.c | 7 ++++--- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 9e8565f8a4..ed3cea44b8 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1555,7 +1555,7 @@ def inherits(): self._rev = self.__class__("".join(L)) return self._rev s = madstring("abcdefghijklmnopqrstuvwxyz") - #XXX verify(s == "abcdefghijklmnopqrstuvwxyz") + verify(s == "abcdefghijklmnopqrstuvwxyz") verify(s.rev() == madstring("zyxwvutsrqponmlkjihgfedcba")) verify(s.rev().rev() == madstring("abcdefghijklmnopqrstuvwxyz")) for i in range(256): @@ -1569,12 +1569,12 @@ def inherits(): base = "\x00" * 5 s = madstring(base) - #XXX verify(s == base) + verify(s == base) verify(str(s) == base) verify(str(s).__class__ is str) verify(hash(s) == hash(base)) - #XXX verify({s: 1}[base] == 1) - #XXX verify({base: 1}[s] == 1) + verify({s: 1}[base] == 1) + verify({base: 1}[s] == 1) verify((s + "").__class__ is str) verify(s + "" == base) verify(("" + s).__class__ is str) @@ -1613,14 +1613,14 @@ def inherits(): verify(s.lower() == base) s = madstring("x y") - #XXX verify(s == "x y") + verify(s == "x y") verify(intern(s).__class__ is str) verify(intern(s) is intern("x y")) verify(intern(s) == "x y") i = intern("y x") s = madstring("y x") - #XXX verify(s == i) + verify(s == i) verify(intern(s).__class__ is str) verify(intern(s) is i) diff --git a/Objects/stringobject.c b/Objects/stringobject.c index 99a16ed174..e29be5a070 100644 --- a/Objects/stringobject.c +++ b/Objects/stringobject.c @@ -824,9 +824,10 @@ string_richcompare(PyStringObject *a, PyStringObject *b, int op) int min_len; PyObject *result; - /* One of the objects is a string object. Make sure the - other one is one, too. */ - if (a->ob_type != b->ob_type) { + /* May sure both arguments use string comparison. + This implies PyString_Check(a) && PyString_Check(b). */ + if (a->ob_type->tp_richcompare != (richcmpfunc)string_richcompare || + b->ob_type->tp_richcompare != (richcmpfunc)string_richcompare) { result = Py_NotImplemented; goto out; } -- 2.50.1