99
1010INF = float ("inf" )
1111NAN = float ("nan" )
12+
13+ class ComplexSubclass (complex ):
14+ pass
15+
16+ class OtherComplexSubclass (complex ):
17+ pass
18+
19+ class MyIndex :
20+ def __init__ (self , value ):
21+ self .value = value
22+
23+ def __index__ (self ):
24+ return self .value
25+
26+ class MyInt :
27+ def __init__ (self , value ):
28+ self .value = value
29+
30+ def __int__ (self ):
31+ return self .value
32+
33+ class FloatLike :
34+ def __init__ (self , value ):
35+ self .value = value
36+
37+ def __float__ (self ):
38+ return self .value
39+
40+ class ComplexLike :
41+ def __init__ (self , value ):
42+ self .value = value
43+
44+ def __complex__ (self ):
45+ return self .value
46+
47+
1248# These tests ensure that complex math does the right thing
1349
1450ZERO_DIVISION = (
@@ -257,19 +293,11 @@ def test_conjugate(self):
257293 self .assertClose (complex (5.3 , 9.8 ).conjugate (), 5.3 - 9.8j )
258294
259295 def test_constructor (self ):
260- class OS :
261- def __init__ (self , value ): self .value = value
262- def __complex__ (self ): return self .value
263- class NS (object ):
264- def __init__ (self , value ): self .value = value
265- def __complex__ (self ): return self .value
266- self .assertEqual (complex (OS (1 + 10j )), 1 + 10j )
267- self .assertEqual (complex (NS (1 + 10j )), 1 + 10j )
268- self .assertRaises (TypeError , complex , OS (None ))
269- self .assertRaises (TypeError , complex , NS (None ))
296+ self .assertEqual (complex (ComplexLike (1 + 10j )), 1 + 10j )
297+ self .assertRaises (TypeError , complex , ComplexLike (None ))
270298 self .assertRaises (TypeError , complex , {})
271- self .assertRaises (TypeError , complex , NS (1.5 ))
272- self .assertRaises (TypeError , complex , NS (1 ))
299+ self .assertRaises (TypeError , complex , ComplexLike (1.5 ))
300+ self .assertRaises (TypeError , complex , ComplexLike (1 ))
273301
274302 self .assertAlmostEqual (complex ("1+10j" ), 1 + 10j )
275303 self .assertAlmostEqual (complex (10 ), 10 + 0j )
@@ -316,8 +344,7 @@ def __complex__(self): return self.value
316344 self .assertAlmostEqual (complex ('-1e-500j' ), 0.0 - 0.0j )
317345 self .assertAlmostEqual (complex ('-1e-500+1e-500j' ), - 0.0 + 0.0j )
318346
319- class complex2 (complex ): pass
320- self .assertAlmostEqual (complex (complex2 (1 + 1j )), 1 + 1j )
347+ self .assertAlmostEqual (complex (ComplexSubclass (1 + 1j )), 1 + 1j )
321348 self .assertAlmostEqual (complex (real = 17 , imag = 23 ), 17 + 23j )
322349 self .assertAlmostEqual (complex (real = 17 + 23j ), 17 + 23j )
323350 self .assertAlmostEqual (complex (real = 17 + 23j , imag = 23 ), 17 + 46j )
@@ -399,33 +426,17 @@ def __complex__(self):
399426
400427 self .assertRaises (EvilExc , complex , evilcomplex ())
401428
402- class float2 :
403- def __init__ (self , value ):
404- self .value = value
405- def __float__ (self ):
406- return self .value
407-
408- self .assertAlmostEqual (complex (float2 (42. )), 42 )
409- self .assertAlmostEqual (complex (real = float2 (17. ), imag = float2 (23. )), 17 + 23j )
410- self .assertRaises (TypeError , complex , float2 (None ))
411-
412- class MyIndex :
413- def __init__ (self , value ):
414- self .value = value
415- def __index__ (self ):
416- return self .value
429+ self .assertAlmostEqual (complex (FloatLike (42. )), 42 )
430+ self .assertAlmostEqual (complex (real = FloatLike (17. ), imag = FloatLike (23. )), 17 + 23j )
431+ self .assertRaises (TypeError , complex , FloatLike (None ))
417432
418433 self .assertAlmostEqual (complex (MyIndex (42 )), 42.0 + 0.0j )
419434 self .assertAlmostEqual (complex (123 , MyIndex (42 )), 123.0 + 42.0j )
420435 self .assertRaises (OverflowError , complex , MyIndex (2 ** 2000 ))
421436 self .assertRaises (OverflowError , complex , 123 , MyIndex (2 ** 2000 ))
422437
423- class MyInt :
424- def __int__ (self ):
425- return 42
426-
427- self .assertRaises (TypeError , complex , MyInt ())
428- self .assertRaises (TypeError , complex , 123 , MyInt ())
438+ self .assertRaises (TypeError , complex , MyInt (42 ))
439+ self .assertRaises (TypeError , complex , 123 , MyInt (42 ))
429440
430441 class complex0 (complex ):
431442 """Test usage of __complex__() when inheriting from 'complex'"""
@@ -452,24 +463,22 @@ def __complex__(self):
452463
453464 @support .requires_IEEE_754
454465 def test_constructor_special_numbers (self ):
455- class complex2 (complex ):
456- pass
457466 for x in 0.0 , - 0.0 , INF , - INF , NAN :
458467 for y in 0.0 , - 0.0 , INF , - INF , NAN :
459468 with self .subTest (x = x , y = y ):
460469 z = complex (x , y )
461470 self .assertFloatsAreIdentical (z .real , x )
462471 self .assertFloatsAreIdentical (z .imag , y )
463- z = complex2 (x , y )
464- self .assertIs (type (z ), complex2 )
472+ z = ComplexSubclass (x , y )
473+ self .assertIs (type (z ), ComplexSubclass )
465474 self .assertFloatsAreIdentical (z .real , x )
466475 self .assertFloatsAreIdentical (z .imag , y )
467- z = complex (complex2 (x , y ))
476+ z = complex (ComplexSubclass (x , y ))
468477 self .assertIs (type (z ), complex )
469478 self .assertFloatsAreIdentical (z .real , x )
470479 self .assertFloatsAreIdentical (z .imag , y )
471- z = complex2 (complex (x , y ))
472- self .assertIs (type (z ), complex2 )
480+ z = ComplexSubclass (complex (x , y ))
481+ self .assertIs (type (z ), ComplexSubclass )
473482 self .assertFloatsAreIdentical (z .real , x )
474483 self .assertFloatsAreIdentical (z .imag , y )
475484
@@ -485,6 +494,35 @@ def test_underscores(self):
485494 if not any (ch in lit for ch in 'xXoObB' ):
486495 self .assertRaises (ValueError , complex , lit )
487496
497+ def test_from_number (self , cls = complex ):
498+ def eq (actual , expected ):
499+ self .assertEqual (actual , expected )
500+ self .assertIs (type (actual ), cls )
501+
502+ eq (cls .from_number (3.14 ), 3.14 + 0j )
503+ eq (cls .from_number (3.14j ), 3.14j )
504+ eq (cls .from_number (314 ), 314.0 + 0j )
505+ eq (cls .from_number (OtherComplexSubclass (3.14 , 2.72 )), 3.14 + 2.72j )
506+ eq (cls .from_number (ComplexLike (3.14 + 2.72j )), 3.14 + 2.72j )
507+ eq (cls .from_number (FloatLike (3.14 )), 3.14 + 0j )
508+ eq (cls .from_number (MyIndex (314 )), 314.0 + 0j )
509+
510+ cNAN = complex (NAN , NAN )
511+ x = cls .from_number (cNAN )
512+ self .assertTrue (x != x )
513+ self .assertIs (type (x ), cls )
514+ if cls is complex :
515+ self .assertIs (cls .from_number (cNAN ), cNAN )
516+
517+ self .assertRaises (TypeError , cls .from_number , '3.14' )
518+ self .assertRaises (TypeError , cls .from_number , b'3.14' )
519+ self .assertRaises (TypeError , cls .from_number , MyInt (314 ))
520+ self .assertRaises (TypeError , cls .from_number , {})
521+ self .assertRaises (TypeError , cls .from_number )
522+
523+ def test_from_number_subclass (self ):
524+ self .test_from_number (ComplexSubclass )
525+
488526 def test_hash (self ):
489527 for x in range (- 30 , 30 ):
490528 self .assertEqual (hash (x ), hash (complex (x , 0 )))
0 commit comments