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

Erik Max Francis max at
Tue Jul 29 22:08:26 CEST 2008

Carl Banks wrote:
> On Jul 29, 1:30 pm, Carl Banks <pavlovevide... at> wrote:
>> On Jul 29, 5:15 am, Heiko Wundram <modeln... at> wrote:
>>> I can't dig up a simple example from code I wrote quickly, but because of the
>>> fact that explicit comparisons always hamper polymorphism
>> I'm not going to take your word for it.  Do you have code that
>> demonstrates how "if x" improves polymorphism relative to simple
>> explicit tests?
> And, in case it wasn't obvious, the way to demonstrate that "if x"
> improves polymorphism relative to simple explicit tests would be
> posting an example where "if x" works but a simple explicit test
> doesn't.  So don't accuse me of changing the question on you: it's the
> same question.

It's pretty elementary, and people thought just describing the issue of 
polymorphism and duck-typing was sufficient to explain it.  Since it 
apparently isn't:

Let's say you come up with some kind of custom sequence class.  You want 
to act like any native sequence type (list, tuple, array, string, etc.) 
in all reasonable ways (length testing, iteration, indexing, etc.) so 
that it can be used in place of these things in code that doesn't 
require explicit types.  You know, standard polymorphism and duck-typing.

So you want a test for whether your custom sequence isn't empty.  To 
create an "simple, explicit test" would be defined an `isntEmpty` method 
that you can call, like so:

	if myObject.isntEmpty():
	    # then do something

However, this wouldn't be polymorphic since now someone would have to 
call a "simple, explicit test" that doesn't exist on all the other 
sequence-like objects.  Therefore, you've broken polymorphism.

The solution is to override the `__nonzero__` method so that you can use 
Boolean testing, just like all the other sequence-like objects:

	if myObject:
	    # then do the same thing

Now people who use your custom sequence type don't have to write special 
code, and code written to deal with sequences using duck typing (which 
is typically nearly all Python code) don't have to know anything special 
about your custom sequence class.

Erik Max Francis && max at &&
  San Jose, CA, USA && 37 18 N 121 57 W && AIM, Y!M erikmaxfrancis
   Everything's gonna be all right / Everything's gonna be okay
    -- Sweetbox

More information about the Python-list mailing list