9
9
10
10
INF = float ("inf" )
11
11
NAN = 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
+
12
48
# These tests ensure that complex math does the right thing
13
49
14
50
ZERO_DIVISION = (
@@ -257,19 +293,11 @@ def test_conjugate(self):
257
293
self .assertClose (complex (5.3 , 9.8 ).conjugate (), 5.3 - 9.8j )
258
294
259
295
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 ))
270
298
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 ))
273
301
274
302
self .assertAlmostEqual (complex ("1+10j" ), 1 + 10j )
275
303
self .assertAlmostEqual (complex (10 ), 10 + 0j )
@@ -316,8 +344,7 @@ def __complex__(self): return self.value
316
344
self .assertAlmostEqual (complex ('-1e-500j' ), 0.0 - 0.0j )
317
345
self .assertAlmostEqual (complex ('-1e-500+1e-500j' ), - 0.0 + 0.0j )
318
346
319
- class complex2 (complex ): pass
320
- self .assertAlmostEqual (complex (complex2 (1 + 1j )), 1 + 1j )
347
+ self .assertAlmostEqual (complex (ComplexSubclass (1 + 1j )), 1 + 1j )
321
348
self .assertAlmostEqual (complex (real = 17 , imag = 23 ), 17 + 23j )
322
349
self .assertAlmostEqual (complex (real = 17 + 23j ), 17 + 23j )
323
350
self .assertAlmostEqual (complex (real = 17 + 23j , imag = 23 ), 17 + 46j )
@@ -399,33 +426,17 @@ def __complex__(self):
399
426
400
427
self .assertRaises (EvilExc , complex , evilcomplex ())
401
428
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 ))
417
432
418
433
self .assertAlmostEqual (complex (MyIndex (42 )), 42.0 + 0.0j )
419
434
self .assertAlmostEqual (complex (123 , MyIndex (42 )), 123.0 + 42.0j )
420
435
self .assertRaises (OverflowError , complex , MyIndex (2 ** 2000 ))
421
436
self .assertRaises (OverflowError , complex , 123 , MyIndex (2 ** 2000 ))
422
437
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 ))
429
440
430
441
class complex0 (complex ):
431
442
"""Test usage of __complex__() when inheriting from 'complex'"""
@@ -452,24 +463,22 @@ def __complex__(self):
452
463
453
464
@support .requires_IEEE_754
454
465
def test_constructor_special_numbers (self ):
455
- class complex2 (complex ):
456
- pass
457
466
for x in 0.0 , - 0.0 , INF , - INF , NAN :
458
467
for y in 0.0 , - 0.0 , INF , - INF , NAN :
459
468
with self .subTest (x = x , y = y ):
460
469
z = complex (x , y )
461
470
self .assertFloatsAreIdentical (z .real , x )
462
471
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 )
465
474
self .assertFloatsAreIdentical (z .real , x )
466
475
self .assertFloatsAreIdentical (z .imag , y )
467
- z = complex (complex2 (x , y ))
476
+ z = complex (ComplexSubclass (x , y ))
468
477
self .assertIs (type (z ), complex )
469
478
self .assertFloatsAreIdentical (z .real , x )
470
479
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 )
473
482
self .assertFloatsAreIdentical (z .real , x )
474
483
self .assertFloatsAreIdentical (z .imag , y )
475
484
@@ -485,6 +494,35 @@ def test_underscores(self):
485
494
if not any (ch in lit for ch in 'xXoObB' ):
486
495
self .assertRaises (ValueError , complex , lit )
487
496
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
+
488
526
def test_hash (self ):
489
527
for x in range (- 30 , 30 ):
490
528
self .assertEqual (hash (x ), hash (complex (x , 0 )))
0 commit comments