[SciPy-dev] Arrays as truth values?

Perry Greenfield perry at stsci.edu
Mon Nov 7 16:32:19 EST 2005


On Nov 7, 2005, at 8:20 AM, Steven H. Rogers wrote:

> Concur that allowing arrays as truth values is the pythonic thing to 
> do.
> Please do it as long as it's documented.
>
> Regards,
> Steve
>
> Travis Oliphant wrote:
>> ...
>>
>> I agree it can bite people, but I'm concerned that arrays not having a
>> truth value is an odd thing in Python --- you have to implement it by
>> raising an error when __nonzero__ is called right?
>>
>> All other objects in Python have truth values (including its built-in
>> array).  My attitude is that its just better to teach people the 
>> proper
>> use of truth values, then to break form with the rest of Python.
>>
>> I'm would definitely like to hear more opinions though.  It would be
>> very easy to simply raise and error when __nonzero__ is called.
>>
>> -Travis

I guess I'd like to challenge the pythonicity of always having truth 
values. The situation here may be unique (so far, I'm not aware of any 
other similar cases). When Python allowed rich comparisons, it meant 
such comparisons didn't have to return simple boolean values. It was 
implemented almost entirely to satisfy Numeric users. This lead to many 
users believing that the results of such comparisons could now be used 
with "and" and "or" since as far as they were concerned, the results 
did result in booleans (arrays, of course).

My argument is that because of this mismatch we can be *sure* that many 
users will try to use arrays this way, regardless of how many warnings 
you put in the documentation. And the vast majority of the time, they 
will not get what they intended. And for many of these cases, that 
there was a mistake may not surface right away (they are going to get 
as a result an array, usually of the right shape, if not the right 
type). For me this is a very big drawback.

Let's look at the other side. Is it obvious what arrays are false? The 
pythonic thing would to make them false if they could be empty. And 
sure, they can be. But that is a pretty rare case of usage.  Who is 
going to use that case very often? Besides, with rank-0 values, then 
people would think the pythonic thing is to treat them as false, but 
they aren't empty. But some might think they should be false if all 
values are 0 (the current Numeric behavior). This case would at least 
be used practically, but it is at odds with how lists and other 
sequences behave.

Essentially, my argument is that this case presents many likely 
surprises for users and when there isn't one obvious way to do it, it 
shouldn't be done. I'd argue that not allowing arrays as truth values 
it is more Pythonic. (Existing arrays don't support rich comparisons, 
and they are false only when empty, as would be expected).

Does anyone else have examples that use rich comparisons to produce 
sequences in other libraries that are treated as truth values?

Perry




More information about the SciPy-Dev mailing list