]> granicus.if.org Git - python/commitdiff
fix len() when __len__() returns a non number type #5137
authorBenjamin Peterson <benjamin@python.org>
Sun, 8 Feb 2009 21:07:20 +0000 (21:07 +0000)
committerBenjamin Peterson <benjamin@python.org>
Sun, 8 Feb 2009 21:07:20 +0000 (21:07 +0000)
Lib/test/test_builtin.py
Misc/NEWS
Objects/typeobject.c

index 0aa0d527a22417e3ab474056ecf106f55994dba5..a62e1244c2d632abd8172aaa04b4f43bcb3ed59b 100644 (file)
@@ -611,6 +611,18 @@ class BuiltinTest(unittest.TestCase):
             def __len__(self):
                 raise ValueError
         self.assertRaises(ValueError, len, BadSeq())
+        class InvalidLen:
+            def __len__(self):
+                return None
+        self.assertRaises(TypeError, len, InvalidLen())
+        class FloatLen:
+            def __len__(self):
+                return 4.5
+        self.assertRaises(TypeError, len, FloatLen())
+        class HugeLen:
+            def __len__(self):
+                return sys.maxsize + 1
+        self.assertRaises(OverflowError, len, HugeLen())
 
     def test_map(self):
         self.assertEqual(
index a0a8d1fab7bad161b9f10a5a8b1f950d300a4d69..5a3b4adad1bc1ff9e3ecbf0f60635bbcb772aad9 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@ What's New in Python 3.1 alpha 0
 Core and Builtins
 -----------------
 
+- Issue #5137: Make len() correctly raise a TypeError when a __len__ method
+  returns a non-number type.
+
 - Issue #5182: Removed memoryview.__str__.
 
 - Issue #1717: Removed builtin cmp() function, dropped tp_compare
index 47e425cab10be3507ff4ddfeab0cf6f95507f713..a362b8457d8cc1e26f8b873aec57ad045c1e9f39 100644 (file)
@@ -4618,7 +4618,7 @@ slot_sq_length(PyObject *self)
 
        if (res == NULL)
                return -1;
-       len = PyLong_AsSsize_t(res);
+       len = PyNumber_AsSsize_t(res, PyExc_OverflowError);
        Py_DECREF(res);
        if (len < 0) {
                if (!PyErr_Occurred())