Best way to make a number of tests against an object('s attributes) with absence of switch statement?

John Machin sjmachin at lexicon.net
Fri Jun 13 23:54:42 EDT 2008


On Jun 14, 12:25 pm, Phillip B Oldham <phillip.old... at gmail.com>
wrote:
> What would be the optimal/pythonic way to subject an object to a
> number of tests (based on the object's attributes) and redirect
> program flow?
>
> Say I had the following:
>
> pets[0] = {'name': 'fluffy', 'species': 'cat', 'size': 'small'}
> pets[1] = {'name': 'bruno', 'species': 'snake', 'size': 'small'}
> pets[2] = {'name': 'rex', 'species': 'dog', 'size': 'large'}

I'd suggest that you have a Pet class, instead of using dicts.

> What I'd like to do is loop through 'pets', and test each object. Some
> of the tests I'd like to perform are:
>
> Is the size 'small' and species not 'dog'?
> Is the species 'cat' and name 'fluffy'?
> Is the species not 'dog' or 'cat'?
>
> In PHP I'd use a switch statement similar to the following:
>
> foreach( $pets as $pet) {
> switch(true) {
> case ( $pet['size'] === 'small' && $pet['species'] !== 'dog' ):
> // do something
> break;
> // etc...
>
> }
> }
>
> Now, I understand from a bit of googling that python doesn't have a
> switch statement, and because of this people rely on python's
> polymorphism. Thats great, but I've yet to come across a decent
> example which make a "click".
>
> Any thoughts on how to proceed?

A switch statement is "optimal" when a variable needs to be tested
against N known constant values ... a compiler can emit code that
takes O(1) time (or O(log(N)) if the constants are sparse) instead of
O(N).

However the way you are using switch, it can't be other than O(N) and
it is just syntactic lemon juice for not having (or not using) if ...
elif ... else.

Python version:

for pet in pets:
   if pet.size == 'small' and pet.species != 'dog':
      pet.feed() # class instances can have user-definable methods
      # don't need "break" to escape from if statement
   elif ..... etc ...

HTH,
John



More information about the Python-list mailing list