micropython/tests/float/complex_dunder.py
Damien George 4fe3e493b1 py/obj: Make mp_obj_get_complex_maybe call mp_obj_get_float_maybe first.
This commit simplifies mp_obj_get_complex_maybe() by first calling
mp_obj_get_float_maybe() to handle the cases corresponding to floats.
Only if that fails does it attempt to extra a full complex number.

This reduces code size and also means that mp_obj_get_complex_maybe() now
supports user-defined classes defining __float__; in particular this allows
user-defined classes to be used as arguments to cmath-module function.

Furthermore, complex_make_new() can now be simplified to directly call
mp_obj_get_complex(), instead of mp_obj_get_complex_maybe() followed by
mp_obj_get_float().  This also improves error messages from complex with
an invalid argument, it now raises "can't convert <type> to complex" rather
than "can't convert <type> to float".

Signed-off-by: Damien George <damien@micropython.org>
2022-07-25 16:11:26 +10:00

47 lines
635 B
Python

# test __complex__ function support
class TestFloat:
def __float__(self):
return 1.0
class TestComplex:
def __complex__(self):
return 1j + 10
class TestStrComplex:
def __complex__(self):
return "a"
class TestNonComplex:
def __complex__(self):
return 6
class Test:
pass
print(complex(TestFloat()))
print(complex(TestComplex()))
try:
print(complex(TestStrComplex()))
except TypeError:
print("TypeError")
try:
print(complex(TestNonComplex()))
except TypeError:
print("TypeError")
try:
print(complex(Test()))
except TypeError:
print("TypeError")