mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Make subclasses of int, long, complex, float, and unicode perform type
conversion using the proper magic slot (e.g., __int__()). Also move conversion code out of PyNumber_*() functions in the C API into the nb_* function. Applied patch #1109424. Thanks Walter Doewald.
This commit is contained in:
parent
d7c795e729
commit
c3647ac93e
10 changed files with 326 additions and 76 deletions
|
@ -545,6 +545,37 @@ class BuiltinTest(unittest.TestCase):
|
|||
self.assertEqual(float(unicode(" 3.14 ")), 3.14)
|
||||
self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
|
||||
|
||||
def test_floatconversion(self):
|
||||
# Make sure that calls to __float__() work properly
|
||||
class Foo0:
|
||||
def __float__(self):
|
||||
return 42.
|
||||
|
||||
class Foo1(object):
|
||||
def __float__(self):
|
||||
return 42.
|
||||
|
||||
class Foo2(float):
|
||||
def __float__(self):
|
||||
return 42.
|
||||
|
||||
class Foo3(float):
|
||||
def __new__(cls, value=0.):
|
||||
return float.__new__(cls, 2*value)
|
||||
|
||||
def __float__(self):
|
||||
return self
|
||||
|
||||
class Foo4(float):
|
||||
def __float__(self):
|
||||
return 42
|
||||
|
||||
self.assertAlmostEqual(float(Foo0()), 42.)
|
||||
self.assertAlmostEqual(float(Foo1()), 42.)
|
||||
self.assertAlmostEqual(float(Foo2()), 42.)
|
||||
self.assertAlmostEqual(float(Foo3(21)), 42.)
|
||||
self.assertRaises(TypeError, float, Foo4(42))
|
||||
|
||||
def test_getattr(self):
|
||||
import sys
|
||||
self.assert_(getattr(sys, 'stdout') is sys.stdout)
|
||||
|
@ -650,6 +681,39 @@ class BuiltinTest(unittest.TestCase):
|
|||
|
||||
self.assertEqual(int('0123', 0), 83)
|
||||
|
||||
def test_intconversion(self):
|
||||
# Test __int__()
|
||||
class Foo0:
|
||||
def __int__(self):
|
||||
return 42
|
||||
|
||||
class Foo1(object):
|
||||
def __int__(self):
|
||||
return 42
|
||||
|
||||
class Foo2(int):
|
||||
def __int__(self):
|
||||
return 42
|
||||
|
||||
class Foo3(int):
|
||||
def __int__(self):
|
||||
return self
|
||||
|
||||
class Foo4(int):
|
||||
def __int__(self):
|
||||
return 42L
|
||||
|
||||
class Foo5(int):
|
||||
def __int__(self):
|
||||
return 42.
|
||||
|
||||
self.assertEqual(int(Foo0()), 42)
|
||||
self.assertEqual(int(Foo1()), 42)
|
||||
self.assertEqual(int(Foo2()), 42)
|
||||
self.assertEqual(int(Foo3()), 0)
|
||||
self.assertEqual(int(Foo4()), 42L)
|
||||
self.assertRaises(TypeError, int, Foo5())
|
||||
|
||||
def test_intern(self):
|
||||
self.assertRaises(TypeError, intern)
|
||||
s = "never interned before"
|
||||
|
@ -810,6 +874,39 @@ class BuiltinTest(unittest.TestCase):
|
|||
self.assertRaises(ValueError, long, '53', 40)
|
||||
self.assertRaises(TypeError, long, 1, 12)
|
||||
|
||||
def test_longconversion(self):
|
||||
# Test __long__()
|
||||
class Foo0:
|
||||
def __long__(self):
|
||||
return 42L
|
||||
|
||||
class Foo1(object):
|
||||
def __long__(self):
|
||||
return 42L
|
||||
|
||||
class Foo2(long):
|
||||
def __long__(self):
|
||||
return 42L
|
||||
|
||||
class Foo3(long):
|
||||
def __long__(self):
|
||||
return self
|
||||
|
||||
class Foo4(long):
|
||||
def __long__(self):
|
||||
return 42
|
||||
|
||||
class Foo5(long):
|
||||
def __long__(self):
|
||||
return 42.
|
||||
|
||||
self.assertEqual(long(Foo0()), 42L)
|
||||
self.assertEqual(long(Foo1()), 42L)
|
||||
self.assertEqual(long(Foo2()), 42L)
|
||||
self.assertEqual(long(Foo3()), 0)
|
||||
self.assertEqual(long(Foo4()), 42)
|
||||
self.assertRaises(TypeError, long, Foo5())
|
||||
|
||||
def test_map(self):
|
||||
self.assertEqual(
|
||||
map(None, 'hello world'),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue