在字典中存储函数映射和参数
我想写一个方法来处理键盘输入,并执行相应的功能(可以选择带上一些参数)。为此,我使用了一个字典,里面存放了一些键盘映射,比如:
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)
现在,这个函数对字典里的前两个条目工作得很好。但是对于第三个条目,如果widget.last_line
发生变化,它就不管用了。Python编译器似乎把这个条目当作一个常量来处理,尽管它实际上是一个小部件的属性。有没有办法让这样的条目保持“可变”,或者有没有更好的方法来执行这样的操作呢?
3 个回答
0
我觉得即使这是一个属性,这个属性的值也是可以改变的。想想这个例子:有一个类叫做 Person,里面有一个名字属性。比如我们创建一个叫做 Mike 的人:
p = Person('Mike')
然后我们把这个人的名字放进一个字典里:
dict[p.name] = something
当你把 p.name 改成 'Joe' 的时候,你是不是希望字典里的映射也能自动变成 dict['Joe'] 呢?
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
你想要的那种方式是无法存储属性的引用的。不过,你可以做的是写一个新函数,当这个函数被调用时,它会获取那个属性的值,然后把这个值传递给 move_to_line
:
KEY_END : (lambda: move_to_line(widget.last_line), None)