[Tutor] easy way to populate a dict with functions

Albert-Jan Roskam fomcl at yahoo.com
Thu Aug 6 20:54:25 CEST 2009


Hi Bob,

Very neat solution, thanks a lot! I didn't know the inspect module, but it's just what's needed here. Cool! And sorry about not starting a new mail. I'll keep it in mind for next time.

Best wishes,
Albert-Jan 

--- On Thu, 8/6/09, bob gailer <bgailer at gmail.com> wrote:

> From: bob gailer <bgailer at gmail.com>
> Subject: RE:  [Tutor] easy way to populate a dict with functions
> To: fomcl at yahoo.com
> Cc: "tutorpythonmailinglist Python" <tutor at python.org>
> Date: Thursday, August 6, 2009, 7:28 PM
> Please start a new email when
> starting a new topic. Otherwise it gets linked to the
> previous one in email clients that follow threads!
> 
> To avoid that here I am responding in a new email. Also
> fixed spelling in subject.
> 
> Albert-Jan Roskam wrote:
> > Hi,
> > 
> > I was playing with the code below, and I was wondering
> if there was a way to populate the dictionary called
> 'commands' (in the function 'check_command()').
> > 
> > Suppose I would add another function, which I would
> also like to store as a value in 'commands', could it simply
> be programmed, or would every update/addition require the
> definition of the dictionary to be extended?
> > It would be most desirable if one could simply add
> another function without there being the need to touch any
> of the other code. 
> > 
> >   
> Here's how I'd do it. Others may have other solutions.
> 
> Put the command functions in a separate module, e.g.,
> commands.py:
> # -------- code ---------------
> def foo (a):
>  return "foo" * a
> 
> def bletch (q):
>  for i in range(20):
>    print i * q
> 
> def stilton (n):
>  print "yes sir, " * n
> 
> def romans (z):
>  print "what have the romans really done for us?\n" * z
> # -------- end code ---------------
> 
> Put the "main" program (in another module) e.g., main.py:
> 
> # -------- code ---------------
> import commands
> import inspect
> cmds = inspect.getmembers(commands, inspect.isfunction)
> num_cmds = len(cmds)
> option_list = "|".join(str(c) for c in range(1,
> num_cmds+1))
> prompt = "choose an option [%s]: " % option_list
> 
> def check_command():
>  while True:
>    select = raw_input(prompt)
>    try:
>      command = cmds[int(select)][1]
>    except ValueError:
>      print "non-numeric option 
>    (%s)" % select
>    except IndexError:
>      print "option out of range (%s)" %
> select
>    else:
>      check_parameter(command)
>      break
> 
> def check_parameter(command):
>  while True:
>    parameter = raw_input("choose a parameter
> [integer]: ")
>    if parameter.isdigit():
>      command(int(parameter))
>      break
>    else:
>      print "illegal parameter (%s)" %
> parameter
> 
> check_command()
> # -------- end code ---------------
> 
> cmds is a list similar to:
>  [('bletch', <function bletch at 0x011BA2B0>),
>  ('foo', <function foo at 0x011AF9B0>),
>  ('romans', <function romans at 0x011BA330>),
>  ('stilton', <function stilton at 0x011BA2F0>)]
> 
> -- Bob Gailer
> Chapel Hill NC
> 919-636-4239
> 
> 


      


More information about the Tutor mailing list