Message52070
The functions in the math module have the (pleasantly) surprising and
apparently undocumented property that they'll accept not just floats, but any Python object having a float method:
>>> class test1(object):
... def __float__(self):
... return 3.
...
>>> from math import sqrt
>>> sqrt(test1())
1.7320508075688772
Based on this, one might expect the functions in the complex math module cmath to have the same property with respect to __complex__.
But this isn't so:
>>> class test2(object):
... def __complex__(self):
... return -3 + 0j
...
>>> from cmath import sqrt as csqrt
>>> csqrt(test2())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: a float is required
The real surprise is that the cmath functions *will* call the __float__ method, if it's available:
>>> csqrt(test1())
(1.7320508075688772+0j)
This patch expands the PyComplex_AsCComplex method so that it looks for a __complex__ method before looking for the __float__ method. This `fixes' the above behaviour.
Should it be a documented feature that the math functions will make use of __float__? If so, and if the patched behaviour seems desirable, I'll add suitable tests to test_math and test_cmath. |
|
Date |
User |
Action |
Args |
2007-08-23 15:57:00 | admin | link | issue1675423 messages |
2007-08-23 15:57:00 | admin | create | |
|