[Python-checkins] r68553 - in python/branches/py3k: Lib/test/test_long.py Misc/NEWS Objects/abstract.c
mark.dickinson
python-checkins at python.org
Mon Jan 12 21:49:19 CET 2009
Author: mark.dickinson
Date: Mon Jan 12 21:49:19 2009
New Revision: 68553
Log:
Issue #4910 (1st patch of a series): fix int() and the corresponding
PyNumber_Int/PyNumber_Long API function so that it no longer attempts
to call the __long__ method for conversion. Only the __int__ and __trunc__
methods are used. (This removes a major remaining use of the nb_long
slot from the Python 3.x core.)
Thanks Benjamin for review.
Modified:
python/branches/py3k/Lib/test/test_long.py
python/branches/py3k/Misc/NEWS
python/branches/py3k/Objects/abstract.c
Modified: python/branches/py3k/Lib/test/test_long.py
==============================================================================
--- python/branches/py3k/Lib/test/test_long.py (original)
+++ python/branches/py3k/Lib/test/test_long.py Mon Jan 12 21:49:19 2009
@@ -367,7 +367,7 @@
def test_conversion(self):
- # Test __long__()
+ # Test __int__()
class ClassicMissingMethods:
pass
self.assertRaises(TypeError, int, ClassicMissingMethods())
@@ -410,18 +410,32 @@
class Classic:
pass
for base in (object, Classic):
- class LongOverridesTrunc(base):
- def __long__(self):
+ class IntOverridesTrunc(base):
+ def __int__(self):
return 42
def __trunc__(self):
return -12
- self.assertEqual(int(LongOverridesTrunc()), 42)
+ self.assertEqual(int(IntOverridesTrunc()), 42)
class JustTrunc(base):
def __trunc__(self):
return 42
self.assertEqual(int(JustTrunc()), 42)
+ class JustLong(base):
+ # test that __long__ no longer used in 3.x
+ def __long__(self):
+ return 42
+ self.assertRaises(TypeError, int, JustLong())
+
+ class LongTrunc(base):
+ # __long__ should be ignored in 3.x
+ def __long__(self):
+ return 42
+ def __trunc__(self):
+ return 1729
+ self.assertEqual(int(LongTrunc()), 1729)
+
for trunc_result_base in (object, Classic):
class Integral(trunc_result_base):
def __int__(self):
Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS (original)
+++ python/branches/py3k/Misc/NEWS Mon Jan 12 21:49:19 2009
@@ -12,6 +12,10 @@
Core and Builtins
-----------------
+- Issue #4910: Builtin int() function and PyNumber_Long/PyNumber_Int API
+ function no longer attempt to call the __long__ slot to convert an object
+ to an integer. Only the __int__ and __trunc__ slots are examined.
+
- Issue #4893: Use NT threading on CE.
- Issue #4915: Port sysmodule to Windows CE.
Modified: python/branches/py3k/Objects/abstract.c
==============================================================================
--- python/branches/py3k/Objects/abstract.c (original)
+++ python/branches/py3k/Objects/abstract.c Mon Jan 12 21:49:19 2009
@@ -1379,19 +1379,7 @@
}
return res;
}
- if (m && m->nb_long) { /* This should include subclasses of long */
- /* Classic classes always take this branch. */
- PyObject *res = m->nb_long(o);
- if (res && !PyLong_Check(res)) {
- PyErr_Format(PyExc_TypeError,
- "__long__ returned non-long (type %.200s)",
- res->ob_type->tp_name);
- Py_DECREF(res);
- return NULL;
- }
- return res;
- }
- if (PyLong_Check(o)) /* A long subclass without nb_long */
+ if (PyLong_Check(o)) /* An int subclass without nb_int */
return _PyLong_Copy((PyLongObject *)o);
trunc_func = PyObject_GetAttr(o, trunc_name);
if (trunc_func) {
More information about the Python-checkins
mailing list