avg_result_var
这是我的代码,当我尝试执行我得到的代码时,“UnboundLocalError:在赋值之前引用的局部变量'params'”
我可以在python中做我想做的事吗?
答案 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"]()