On 1/24/07, Gareth McCaughan <gareth.mccaughan@pobox.com > wrote:
[Alexey:]
> I think that's the right thing to do, because that is mathematically
> correct. j is just an imaginary number with a property that j*j = -1. So
> (a+bj) + (c+dj)j = (a-d) + (b+c)j.

Yes, thanks, I know what j is, and I know how to multiply
complex numbers. (All of which you could have deduced from
reading what I wrote, as it happens.) The question is whether
it makes sense to define complex(a,b) = a+ib for all a,b
or whether the two-argument form is always in practice going
to be used with real numbers[1]. If it is, which seems pretty
plausible to me, then changing complex() to complain when
passed two complex numbers would (1) notify users sooner
when they have errors in their programs, (2) simplify the
code, and (3) avoid the arguably broken behaviour Tim was
remarking on, where complex(-0.0).real is +0 instead of -0.
 
Haven't looked in source code for complex constructor yet, but I think that if it changes sign of -0.0 then it just does something wrong and needs fixing without change in behaviour. Maybe it could check if numbers it got on input are real or complex and proceed accordingly so that it never gets to computing - 0.0-(+0.0), i.e. when second argument is not a complex number it could just add it to imaginary part of first argument, but skip substracting inexistant 0.0 from first argument's real part. Change of behaviour like ignoring imaginary part of second argument seems bad to me, and that's my only point. Besides, documentation (at least for Python 2.4) clearly states that second argument can be a complex number:
 
complex( [real[, imag]])
Create a complex number with the value real + imag*j or convert a string or number to a complex number. If the first parameter is a string, it will be interpreted as a complex number and the function must be called without a second parameter. The second parameter can never be a string. Each argument may be any numeric type (including complex). If imag is omitted, it defaults to zero and the function serves as a numeric conversion function like int(), long() and float(). If both arguments are omitted, returns 0j.