I was trying to come up with a dictionary of functions, but get it not to work.

Sorry, mindreading is not my métier. Please gives us an example of your code and the error message you get.

You mean something like this?

import re
f = dict()
f["compile"] = re.compile
f["findall"] = re.findall
f["match"] = re.match
pattern = f["compile"]("[\\w]+")

This works for me.

Thanks G-Do! I think you gave me a good hint where i went wrong. Here is my error prone code:

# a dictionary of functions by bumsfeld
# get errors = TypeError: 'int' object is not callable

def add(a, b):
    return a + b

def sub(a, b):
    return a - b

def mul(a, b):
    return a * b

def div(a, b):
    return a / b

a = b = 1

mathD = {
'+' : add(a, b),
'-' : sub(a, b),
'*' : mul(a, b),
'/' : div(a, b)
}

f = mathD['+']
print f(99, 13)

G-Do did give you the hint, don't call the functions from the dictionary, just reference them. I took the liberty to play with your code a little ...

def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

def multiply(a, b):
    return a * b

def divide(a, b):
    if b == 0:
        print "divide by zero error"
    else:
        return a / b

# use the function reference, not the actual call
mathD = {
'+' : add,
'-' : subtract,
'*' : multiply,
'/' : divide
}


f = mathD['+']
print f(99, 13)

# or simpler ...
print mathD['+'](99, 13)

# maybe less cryptic ...
def calc(math_op, a, b):
    return mathD[math_op](a, b)

# now you can use ...
print calc('/', 355, 113.0)

How can you handle the wrong symbol? Like someone uses '**' and not '*'

That's where the calc() function would come in handy, change it to ...

def calc(math_op, a, b):
    if math_op in mathD:
        return mathD[math_op](a, b)
    else:
        print "'%s' not recognized" % math_op

That is not necessarily the OP's actual question,
(does not even have a dictionary of functions)
but I was facing the problem that I needed something like the calc function
that vegaseat suggested and this is what I came up with:

mathD = {
    '+': '__add__',
    '-': '__sub__',
    '*': '__mul__',
    '/': '__div__'
}

def calc(op, a, b):
    method = getattr(a,mathD[op])
    return method(b)

Saves me writing down all the defs :D

Thanks for the tip. Now it look even better. (And I am using a dictionary of functions.)

from operator import add, sub, mul, div

mathD = {
    '+': add,
    '-': sub,
    '*': mul,
    '/': div
}

def calc(op, a, b):
    return mathD[op](a,b)
Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.