On Jun 14, 12:25 pm, Phillip B Oldham <[EMAIL PROTECTED]>
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
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to