switch recipe?

Sean 'Shaleh' Perry shalehperry at attbi.com
Fri Jul 12 15:45:39 EDT 2002


On 12-Jul-2002 Mark McEahern wrote:
> In response to a question earlier today, I wrote a function I called
> make_color_switch:
> 
>   from __future__ import generators
> 
>   def make_color_switch(color1, color2):
>       def color_switch():
>           i = 0
>           while True:
>               if i % 2:
>                   yield color2
> 
> It seemed like this could be more generic:
> 
>   from __future__ import generators
> 
>   def make_switch(*args):
>       """Return a generator that loops through args."""
>       if not args:
>           raise RuntimeError("Missing parameter: args.")
>       def switch():
>           i = n = 0
>           while True:
>               i = n % len(args)
>               yield args[i]
>               n += 1
>       return switch
> 

out of curiosity, what happens when n reaches the end of the int/long/whatever
that stores it?

> Is switch a bad name for this?  Can anyone suggest a better name?  Other
> improvements?  What I like about this code is it demonstrates several
> "advanced" features of Python, all the while retaining (imho) the simplicity
> and clarity Python is known for:
> 
>   generators
>   nested scopes
>   variable length argument arrays
>   functions as objects
> 
> Here's sample code that shows it used in the context of the original
> question:
> 

while the above code is a nice sample, the below code should not be given to
people learning the language, it uses way too many tricks.  Plus one letter
variable names are a pain.

>   def colorize(s, *colors):
>       switch = make_switch(*colors)()
>       template = "<%(color)s><b>%(c)s</b></color>"
>       l = []
>       for c in s:
>           color = switch.next()
>           l.append(template % locals())
>       print ''.join(l)
> 
>   colorize("testing", "black", "red", "green", "blue")
> 

switch is an interesting idea, definately needs a new name.





More information about the Python-list mailing list