bpo-40824: Do not mask errors in __iter__ in "in" and the operator module. (GH-20537)

Unexpected errors in calling the __iter__ method are no longer
masked by TypeError in the "in" operator and functions
operator.contains(), operator.indexOf() and operator.countOf().
This commit is contained in:
Serhiy Storchaka 2020-06-22 10:43:35 +03:00 committed by GitHub
parent 4901ea9526
commit cafe1b6e9d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 21 additions and 1 deletions

View file

@ -35,6 +35,10 @@ class Seq2(object):
def __rmul__(self, other):
return other * self.lst
class BadIterable:
def __iter__(self):
raise ZeroDivisionError
class OperatorTestCase:
def test_lt(self):
@ -142,6 +146,7 @@ class OperatorTestCase:
operator = self.module
self.assertRaises(TypeError, operator.countOf)
self.assertRaises(TypeError, operator.countOf, None, None)
self.assertRaises(ZeroDivisionError, operator.countOf, BadIterable(), 1)
self.assertEqual(operator.countOf([1, 2, 1, 3, 1, 4], 3), 1)
self.assertEqual(operator.countOf([1, 2, 1, 3, 1, 4], 5), 0)
@ -176,6 +181,7 @@ class OperatorTestCase:
operator = self.module
self.assertRaises(TypeError, operator.indexOf)
self.assertRaises(TypeError, operator.indexOf, None, None)
self.assertRaises(ZeroDivisionError, operator.indexOf, BadIterable(), 1)
self.assertEqual(operator.indexOf([4, 3, 2, 1], 3), 1)
self.assertRaises(ValueError, operator.indexOf, [4, 3, 2, 1], 0)
@ -258,6 +264,7 @@ class OperatorTestCase:
operator = self.module
self.assertRaises(TypeError, operator.contains)
self.assertRaises(TypeError, operator.contains, None, None)
self.assertRaises(ZeroDivisionError, operator.contains, BadIterable(), 1)
self.assertTrue(operator.contains(range(4), 2))
self.assertFalse(operator.contains(range(4), 5))