Python 将函数映射和参数存储在dict中

Python 将函数映射和参数存储在dict中,python,dictionary,python-curses,Python,Dictionary,Python Curses,我尝试编写一个方法来处理键盘输入并执行适当的函数(可选地带有一些参数)。因此,我将dict与一些键盘映射一起使用,如 mappings = { 'q' : (quit , None), KEY_HOME : (move_to_line , 1), KEY_END : (move_to_line , widget.last_line) } 处理程序函数本身看起来像: def handle_input(user_input): if u

我尝试编写一个方法来处理键盘输入并执行适当的函数(可选地带有一些参数)。因此,我将dict与一些键盘映射一起使用,如

mappings = {
    'q'      : (quit         , None),
    KEY_HOME : (move_to_line , 1),
    KEY_END  : (move_to_line , widget.last_line)
}
处理程序函数本身看起来像:

def handle_input(user_input):

    if user_input in mappings.keys():
        func = mappings[user_input][0]
        args = mappings[user_input][1]
        if args == None:
            func()
        elif type(args) == list:
            func(*args)
        elif type(args) == dict:
            func(**args)
        else:
            func(args)

现在,该函数对于前两个dict条目运行良好。对于第三个条目,如果
widget.last\u行
发生更改,则它不起作用。python编译器似乎将此项作为常量值处理,即使它是小部件的属性。有没有办法让这样一个条目保持“不稳定”,或者有更好的方法来执行这样一个操作?

我认为即使它是一个属性,属性的值也会改变。考虑这个:类人:名字 p=人(“迈克”) dict[p.name]=某物


当您将p.name更改为'Joe'时,是否希望字典映射神奇地更改为dict['Joe']?

更改此项的最后一项:
KEY\u END:(移动到最后一行,小部件)

其中
移动到最后一行是:

def move_to_last_line(widget):
  move_to_line(widget.last_line)

无法以您想要的方式存储对属性的引用。不过,您可以编写一个新函数,在调用属性时获取该属性,然后将当时的值传递给
move\u to\u line

KEY_END  : (lambda: move_to_line(widget.last_line), None)

即使我用类似于
widget.get\u last\u line()
的函数调用替换属性
widget.last\u line
,编译器也会将条目视为常量值(在编译时计算)。避免这种情况的唯一方法似乎是Blckknght在上面发布的lambda构造是的,这是正确的,但我一开始并没有想到lambda构造:)