【问题标题】:Store function mappings and arguments in a dict将函数映射和参数存储在 dict 中
【发布时间】:2014-06-17 05:00:00
【问题描述】:

我尝试编写一个方法来处理键盘输入并执行适当的功能(可选地带有一些参数)。因此,我正在使用带有一些键盘映射的 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 编译器似乎将此条目作为常量值处理,即使它是小部件的属性。有没有办法让这样的条目保持“不稳定”,或者有更好的方法来执行这样的操作?

【问题讨论】:

    标签: python dictionary python-curses


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      更改最后一个条目:KEY_END : (move_to_last_line , widget)

      move_to_last_line 在哪里:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 即使我将属性widget.last_line 替换为widget.get_last_line() 之类的函数调用,编译器也会将该条目视为常量值(在编译时评估)。避免这种情况的唯一方法似乎是上面 Blckknght 发布的 lambda 构造
        • 是的,没错,但最初我并没有想到 lambda 构造:)
        猜你喜欢
        • 2010-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-22
        • 2021-02-05
        • 2022-10-01
        • 1970-01-01
        • 2016-11-03
        相关资源
        最近更新 更多