Merged revisions 71627 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r71627 | benjamin.peterson | 2009-04-15 16:26:36 -0500 (Wed, 15 Apr 2009) | 4 lines

  call __float__ on str subclasses #5759

  tests by R. David Murray
........
This commit is contained in:
Benjamin Peterson 2009-04-15 21:34:27 +00:00
parent 50a1469557
commit 2808d3c418
3 changed files with 12 additions and 1 deletions

View File

@ -78,11 +78,18 @@ class GeneralFloatCases(unittest.TestCase):
def __float__(self): def __float__(self):
return 42 return 42
# Issue 5759: __float__ not called on str subclasses (though it is on
# unicode subclasses).
class FooStr(str):
def __float__(self):
return float(str(self)) + 1
self.assertAlmostEqual(float(Foo0()), 42.) self.assertAlmostEqual(float(Foo0()), 42.)
self.assertAlmostEqual(float(Foo1()), 42.) self.assertAlmostEqual(float(Foo1()), 42.)
self.assertAlmostEqual(float(Foo2()), 42.) self.assertAlmostEqual(float(Foo2()), 42.)
self.assertAlmostEqual(float(Foo3(21)), 42.) self.assertAlmostEqual(float(Foo3(21)), 42.)
self.assertRaises(TypeError, float, Foo4(42)) self.assertRaises(TypeError, float, Foo4(42))
self.assertAlmostEqual(float(FooStr('8')), 9.)
def test_floatasratio(self): def test_floatasratio(self):
for f, ratio in [ for f, ratio in [

View File

@ -12,6 +12,8 @@ What's New in Python 3.1 beta 1?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #5759: float() didn't call __float__ on str subclasses.
- The string.maketrans() function is deprecated; there is a new static method - The string.maketrans() function is deprecated; there is a new static method
maketrans() on the bytes and bytearray classes. This removes confusion about maketrans() on the bytes and bytearray classes. This removes confusion about
the types string.maketrans() is supposed to work with, and mirrors the the types string.maketrans() is supposed to work with, and mirrors the

View File

@ -1533,7 +1533,9 @@ float_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return float_subtype_new(type, args, kwds); /* Wimp out */ return float_subtype_new(type, args, kwds); /* Wimp out */
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:float", kwlist, &x)) if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:float", kwlist, &x))
return NULL; return NULL;
if (PyUnicode_Check(x)) /* If it's a string, but not a string subclass, use
PyFloat_FromString. */
if (PyUnicode_CheckExact(x))
return PyFloat_FromString(x); return PyFloat_FromString(x);
return PyNumber_Float(x); return PyNumber_Float(x);
} }