在字典中声明函数

时间:2015-07-19 17:41:34

标签: python

avg_result_var

这是我的代码,当我尝试执行我得到的代码时,“UnboundLocalError:在赋值之前引用的局部变量'params'”

我可以在python中做我想做的事吗?

4 个答案:

答案 0 :(得分:6)

那么,

实际发生了什么
 methodDict = {'add': addDB(myDict, params[1], params[2]),
              'find': findDB(myDict, params[1]),
              'del': removeDB(myDict, params[1], params[2]),
              'clear': clearAll(myDict)}

执行 addDB等,也就是说,如果要运行,您的methodDict将包含addDB(...params...)的结果。

不幸的是它没有运行,因为在执行发生时没有定义params。

你想要做的是,在字典中存储一个callable并运行它......就像

methodDict = {'add': lambda x: addDB(myDict, x[0], x[1])}
# and you execute with
methodDict['add'](params)

答案 1 :(得分:4)

除非提供所有参数,否则您可以使用functools.partial函数来延迟函数的执行。

from functools import partial

def add(x, y):
    return x + y

>>> partial_add = partial(add, 5)
>>> partial_add(7)
12

关于你的问题;

def mainProgram(myDict):
    methodDict = {'add': partial(addDB, myDict),
                  'find': partial(findDB, myDict),
                  'del': partial(removeDB, myDict),
                  'clear': partial(clearAll, myDict)}

    inpt = None
    while inpt != "End":
        inpt = input("-->")
        params = inpt.split()
        methodDict[params[0]](*params[1:])

答案 2 :(得分:2)

您是否尝试使用命令行提供给input提示符的参数来组合函数?您可以使用lambda执行此操作,但在这种情况下,您似乎已经定义了函数,那么为什么要担心呢?

def main_program(dct):
    methods = {'add': addDB,
               'find': findDB,
               'del': removeDB,
               'clear': clearAll}

    inp = input("whatever")
    method_name, *args = inp.split()
    try:
        method = methods[method_name]
    except KeyError:
        # what do you do when the user's entry is wrong?
    else:
        method(dct, *args)

您也可以使用functools.partial这种方法,正如@ozgur在他出色的答案中所做的那样

from functools import partial

def main_program(dct):
    methods = {'add': partial(addDB, dct),
               ...}
    # note that this is identical in effect to
    # # lambda *args: addDB(dct, *args)
    ...
    method_name, *args = inp.split()
    method = methods[method_name]  # ignoring the try/catch behavior above
    method(*args)

答案 3 :(得分:1)

这不是解决方案,但我认为使用reference比在字典中声明更好。

def test():
    print("it works")

dict = {"blabla" : test}
dict["blabla"]()