Validate that __length_hint__ returns a usable result.

This commit is contained in:
Raymond Hettinger 2009-02-03 02:12:10 +00:00
parent 94a45da6be
commit 5d65412d35
2 changed files with 11 additions and 1 deletions

View File

@ -208,6 +208,11 @@ class BadLengthHint(object):
def __length_hint__(self):
raise RuntimeError('hello')
class NoneLengthHint(object):
def __iter__(self): return iter(range(10))
def __length_hint__(self):
return None
class TestLengthHintExceptions(unittest.TestCase):
def test_issue1242657(self):
@ -219,6 +224,11 @@ class TestLengthHintExceptions(unittest.TestCase):
self.assertRaises(RuntimeError, b.extend, BadLen())
self.assertRaises(RuntimeError, b.extend, BadLengthHint())
def test_invalid_hint(self):
# Make sure an invalid result doesn't muck-up the works
self.assertEqual(list(NoneLengthHint()), list(range(10)))
def test_main():
unittests = [
TestRepeat,

View File

@ -105,7 +105,7 @@ _PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
PyErr_Clear();
return defaultvalue;
}
rv = PyLong_AsSsize_t(ro);
rv = PyLong_Check(ro) ? PyLong_AsSsize_t(ro) : defaultvalue;
Py_DECREF(ro);
return rv;
}