From: R. David Murray Date: Mon, 14 Dec 2009 16:28:26 +0000 (+0000) Subject: Issue #1680159: unicode coercion during an 'in' operation was masking X-Git-Tag: v2.7a2~170 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0a0a1a842c02c87fcb052dec226f591cfe6f988f;p=python Issue #1680159: unicode coercion during an 'in' operation was masking any errors that might occur during coercion of the left operand and turning them into a TypeError with a message text that was confusing in the given context. This patch lets any errors through, as was already done during coercion of the right hand side. --- diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 2b269cc622..31bceb3c9f 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -344,7 +344,8 @@ class UnicodeTest( # If the following fails either # the contains operator does not propagate UnicodeErrors or # someone has changed the default encoding - self.assertRaises(UnicodeError, 'g\xe2teau'.__contains__, u'\xe2') + self.assertRaises(UnicodeDecodeError, 'g\xe2teau'.__contains__, u'\xe2') + self.assertRaises(UnicodeDecodeError, u'g\xe2teau'.__contains__, '\xe2') self.assertTrue(u'' in '') self.assertTrue('' in u'') @@ -375,6 +376,7 @@ class UnicodeTest( self.assertTrue(u'asdf' not in u'') self.assertRaises(TypeError, u"abc".__contains__) + self.assertRaises(TypeError, u"abc".__contains__, object()) def test_formatting(self): string_tests.MixinStrUnicodeUserStringTest.test_formatting(self) diff --git a/Misc/NEWS b/Misc/NEWS index cfdf975e20..08369a2e78 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 2.7 alpha 2? Core and Builtins ----------------- +- Issue #1680159: unicode coercion during an 'in' operation no longer masks + the underlying error when the coercion fails for the left hand operand. + - Issue #7491: Metaclass's __cmp__ method was ignored. - Issue #7466: segmentation fault when the garbage collector is called diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index e85b20fa03..79e824ee76 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -6502,8 +6502,6 @@ int PyUnicode_Contains(PyObject *container, /* Coerce the two arguments */ sub = PyUnicode_FromObject(element); if (!sub) { - PyErr_SetString(PyExc_TypeError, - "'in ' requires string as left operand"); return -1; }