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

时间:2014-06-17 05:00:01

标签: 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 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_line更改时无效。 python编译器似乎将此条目作为常量值处理,即使它是小部件的属性。有没有办法保持这样的条目" volatile",还是有更好的方法来执行这样的操作?

3 个答案:

答案 0 :(得分:2)

无法以您希望的方式存储对属性的引用。你可以做的是写一个新的函数,在调用它时获取属性,然后将那时的值传递给move_to_line

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

答案 1 :(得分:1)

更改上一条:KEY_END : (move_to_last_line , widget)

move_to_last_line的位置:

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

答案 2 :(得分:0)

我认为即使它是属性,属性的也会改变。考虑一下:class Person:name p =人('迈克') dict [p.name] =某事

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