Boolean tests [was Re: Attack a sacred Python Cow]

Antoon Pardon apardon at forel.vub.ac.be
Mon Aug 4 04:56:52 EDT 2008


On 2008-08-01, Terry Reedy <tjreedy at udel.edu> wrote:
>> Nevertheless, I think this is probably the best example of the
>> enhanced polymorphism of "if x" yet.  I'm kind of surprised no one
>> came up with it.)
>
> I think of Python code as 'generic' rather than 'polymorphic'.  I am not 
> sure if that is a real difference or not, since I am a bit fuzzy on the 
> meaning of 'polymorphic' in this context.
>
> The generality of 'if x:' depends on the context.  If x is defined as a 
> number by doc or previous code (or possibly even by subsequent code), 
> then 'if x:' is equivalent to 'if x != 0:'.  At this point, it is a 
> stylistic argument which to use.
>
> But here is an example where 'if x:' is more generic.
>
> def solve(a,b):
>     'a and b such that b/a exists'
>     if a:
>        return a/b
>     else:
>        raise ValueError('a not invertible, cannot solve'
>
> Now suppose we have a matrix class (2x2 for simplicity and realism).
> Its __bool__ (3.0) method implements 'is non-singular'.  As written 
> above, solve(mat,vec) works (with compatible mat and vec sizes), but it 
> would not with 'if a != 0:'.
>
> Of course, the issue goes away by not looking before the leap:
>
> def solve(a,b):
>      return a/b
>      # let callers deal with exceptions
> or
>      try:
>         return a/b
>      except...
>        # raise customized error

Maybe I'm going to be pedantic here, but I fear that your code won't
work with matrices. The problem is that multiplication is not
commutative with matrices. This means that matrices have two divisions a right
and a left division. A far as I know the "/" operator usaly implements
the left division while solving is done by using a right division.

So your code will probably fail when applied to matrices.

-- 
Antoon Pardon



More information about the Python-list mailing list