4fe3e493b1
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>
47 lines
635 B
Python
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")
|