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

Antoon Pardon apardon at forel.vub.ac.be
Fri Aug 1 03:33:52 EDT 2008


On 2008-08-01, Carl Banks <pavlovevidence at gmail.com> wrote:
> On Jul 31, 1:27 pm, "Chris Mellon" <arka... at gmail.com> wrote:
>> I'm really not sure where you're going with this or what you're trying
>> to prove. "if x" is a duck-type test for a boolean value. Obviously if
>> you know the type and want a more *specific* test, then you can use an
>> explicit one. Any time you don't know or don't care about a more
>> specific type than "something which probably is boolean true", or any
>> time where you know the boolean semantics of the type and want to drop
>> some typing, you can use "if x". The more specific test is what you'd
>> use if you want more specific results. What's complicated about this
>> idea?
>
> Many people trumpet that "if x" makes your code more polymorphic
> whenever this comes up--in fact you just repeated the claim--without
> ever considering how rarely this more extensive polymorphism comes up
> in practice.   I was calling them out to say "prove to me that it
> actually happens".
>
> I believe it's very rare not to know enough about the expected type
> that explicit tests won't work.  We've uncovered a few examples of it
> in this thread, but IMO we haven't uncovered any sort of broad, wide-
> ranging use cases.

I was reading this thread and was wondering about the following problem.

I have a loop that continuously calculates something. I also have a
producer that may produce extra input that can influence the
calculations. The producer can also indicate the loop should finish.

So the result of produce can be three things:

  1) A not empty sequence; indicating available input.

  2) An empty sequence; indicating no input available now.

  3) None; indicating the end of the calculations.


So the loop essentially looks like this:

while 1:
  extra = produce()
  if extra is None:
    break
  for el in extra:
    adjust_with(el)
  calculate()


I now have the following question for people who argue that "if x"
is more polymorphic. I could subclass list, so that instances
of this new sequence would always behave as true, even if they are
empty.  I could then rewrite my loop as follows:

while 1:
  extra = produce()
  if not extra:
    break
  for el in extra:
    adjust_with(el)
  calculate()

Is this second loop now more polymorphic as the first?

Personnaly I would argue that the first loop with the more specific
test is more polymorphic in this case, as it works with the standard
sequence semantics of python; so the first loop will work with
produce, producing any kind of sequence while the second loop
will only work with produce producing a specific kind of sequence.

-- 
Antoon Pardon



More information about the Python-list mailing list