Dispatching functions from a dictionary

Paul Rubin http
Sun Mar 30 23:06:18 CEST 2008

tkpmep at gmail.com writes:
> RVDict= {'1': random.betavariate(1,1),     '2': random.expovariate(1), ...}

This actually calls the functions random.betavariate, etc.  when
initializing RVDict.  If you print out the contents of RVDict you'll see
that each value in it is just a floating point number, not a callable.

You want something like:

  RVDict = {'1': lambda: random.betavariate(1,1),
            '2': lambda: random.expovariate(1),     etc.

The "lambda" keyword creates a function that when called evaluates the
expression that you gave it.  For example, lambda x: x*x   is a function
that squares its argument, so saying
    y = (lambda x: x*x) (3)

is similar to saying:

    def square(x): return x*x
    y = square(3)

Both of them set y to 9.  In the case of lambda: random.expovariate(1)
you have made a function with no args, so you'd call it like this:

> rvfunc = RVDict[str(RVType)]
> for i in range(N):
>     x.append(rvfunc())
>     y.append(rvfunc())

rvfunc (the retrieved dictionary item) is now a callable function
instead of just a number.  It takes no args, so you call it by saying

More information about the Python-list mailing list