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

giltay at gmail.com giltay at gmail.com
Wed Jul 30 09:31:28 EDT 2008


On Jul 30, 5:09 am, Maric Michaud <ma... at aristote.info> wrote:
> Le Tuesday 29 July 2008 23:48:31 gil... at gmail.com, vous avez écrit :
> > def print_members(iterable):
> >     if not iterable:
> >         print '<members />'
> >         return
> >     print '<members>'
> >     for item in iterable:
> >         print '<item>%s</item>' % item
> >     print '</members>'
>
> But iterables can have no notion of emptiness too :
>
> >>>[25]: print_members((e for e in range(0)))
>
> <members>
> </members>

Ack!  Maybe I meant "container" rather than "iterable".  Or maybe I'd
be wrong on that count, too.  Other people have come up with better
examples, so I won't try to fix my hasty code (although I'll keep that
in mind if I have to write a custom XML writer).

> > class Signal:
> >     [...]
> >     def dc_offset(self, amount):
> >         if amount == 0:
> >             return
> >         self.samples = [sample + amount for sample in self.samples]
>
> This function is also wrong assuming that because amount compare to zero, it
> can be added to sample.

Not quite.  I'm assuming that if amount equals 0, then amount is some
scalar.  In fact, only if that comparison fails will I get my
exception: since [] != 0, it will then try to add sample + [], which
will raise TypeError.

> If you want to make type checking just check the type or convert your
> parameter to an int, but the test "== 0" is of no help here.

I'm not going for type checking here because I want Signal to support
int and float samples (and numpy.int16, &c.).

> The only valuable point I see for this idiom is to make more explicit I am
> testing a numerical value.

That's one of the reasons I wrote it that way.  Signal has other
methods that take lists (like mix and envelope), which I could get
confused with the ones that take scalars (offset and change volume).

     Cheers,
Geoff G-T



More information about the Python-list mailing list