[Python-Dev] return type of complex (original) (raw)

Steven D'Aprano steve at pearwood.info
Sun Oct 21 13:00:53 CEST 2012


On 21/10/12 13:57, Nick Coghlan wrote:

On Sun, Oct 21, 2012 at 11:53 AM, Steven D'Aprano<steve at pearwood.info> wrote:

Python 2.x legitimately distinguished between floats and complex, e.g.:

py> (-100.0)**0.5 Traceback (most recent call last): File "", line 1, in ValueError: negative number cannot be raised to a fractional power If you wanted a complex result, you can explicitly ask for one: py> (-100.0+0j)**0.5 (6.123031769111886e-16+10j)

I see that behaviour is changed in Python 3. Was this discussed before being changed? I see a single sample docstring buried in PEP 3141 that: """a**b; should promote to float or complex when necessary.""" but I can't find any discussion of the consequences of this for the majority of users who would be surprised by the unexpected appearance of a "j" inside their numbers. PEP 3141 is indeed the driver for these changes, and it's based on the Python 3.x numeric tower consisting of strict supersets: Complex> Real> Rational> Integral If an operation at one level of the tower produces a result in one of the larger supersets, then that's what it will do rather than throwing TypeError. int / int promoting to float is one example, as is raising a negative number to a fractional power promoting to complex. The general philosophy is described in http://www.python.org/dev/peps/pep-3141/#implementing-the-arithmetic-operations

Yes, I've read that. But it seems to me that this change appears to have been driven by type-purity (floats are Liskov-substituable for complex) rather than practical considerations for people who may not know what complex numbers are, or at best may have vague recollections of being told about them in high school, and who now have to deal with the unexpected appearance of complex numbers in calculations which previously gave an exception.

When you're dealing with numbers that represent real quantities, getting a complex result is nearly always an error condition. Better to get an exception at the point that occurs, than somewhere distant when the number gets fed to %f formatting, or worse, no error at all, just a silently generating garbage results.

-- Steven



More information about the Python-Dev mailing list