Browse Source
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>pull/8905/head
Damien George
2 years ago
5 changed files with 45 additions and 21 deletions
@ -0,0 +1,21 @@ |
|||
# test that cmath functions support user classes with __float__ and __complex__ |
|||
|
|||
try: |
|||
import cmath |
|||
except ImportError: |
|||
print("SKIP") |
|||
raise SystemExit |
|||
|
|||
|
|||
class TestFloat: |
|||
def __float__(self): |
|||
return 1.0 |
|||
|
|||
|
|||
class TestComplex: |
|||
def __complex__(self): |
|||
return 1j + 10 |
|||
|
|||
|
|||
for clas in TestFloat, TestComplex: |
|||
print("%.5g" % cmath.phase(clas())) |
@ -0,0 +1,15 @@ |
|||
# test that math functions support user classes with __float__ |
|||
|
|||
try: |
|||
import math |
|||
except ImportError: |
|||
print("SKIP") |
|||
raise SystemExit |
|||
|
|||
|
|||
class TestFloat: |
|||
def __float__(self): |
|||
return 1.0 |
|||
|
|||
|
|||
print("%.5g" % math.exp(TestFloat())) |
Loading…
Reference in new issue