(original) (raw)

You can check the .image attribute, which exists on floats too (and ints).

--Guido van Rossum (sent from Android phone)

On Oct 20, 2012 6:54 PM, "Steven D'Aprano" <steve@pearwood.info> wrote:
On 21/10/12 06:28, Tres Seaver wrote:
\-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 10/19/2012 07:35 PM, Greg Ewing wrote:
Antonio Cuni wrote:
Traceback (most recent call last): File "", line 1, in
�TypeError: \_\_complex\_\_ should return a complex object

i.e., the complex constructor does not check that \_\_complex\_\_
returns an actual complex, while the cmath functions do.

Looks to me like cmath is being excessively finicky here. Why
shouldn't a float be usable in \*any\* context expecting a complex?

Exactly: �float is perfectly Liskov-substituable for complex; �only
applications which do explicit type sniffing can tell the difference,
which makes the sniffing bogus.


But float is not \*numerically\* substitutable for complex, which is why
type-sniffing is not bogus at all. If you have an application which
assumes numeric quantities represent real values, then you need to
distinguish between real-valued and complex-valued arithmetic, and
treating floats as implicitly complex is the wrong thing to do.

Since most applications are based on real-values, implicit promotion to
complex is in my opinion an anti-feature.

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.

Nor is there any hint in the docs for pow and \*\* that they will promote
floats to complex:

http://docs.python.org/dev/library/functions.html#pow

http://docs.python.org/dev/library/stdtypes.html#numeric-types-int-float-complex



\--
Steven
\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: http://mail.python.org/mailman/options/python-dev/guido%40python.org