Repository navigation
Make PyComplex_AsCComplex use __complex__ #44670
Description
Activity
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.
- addedinterpreter-core(Objects, Python, Grammar, and Parser dirs)(Objects, Python, Grammar, and Parser dirs)
on Mar 7, 2007 - addedinterpreter-core(Objects, Python, Grammar, and Parser dirs)(Objects, Python, Grammar, and Parser dirs)
on Mar 7, 2007 I think it is the right thing to do.
Test cases would be welcome.
Please include both old-style and new-style classes in the test case, and for each one test if the check for a complex return from __complex__ works.
File Added: complex_patch.patch
OK, thank you! Committed the patch, new tests and docs in rev. 54421.
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields: