你认为这很容易。
我有以下代码:
key_handlers=collections.defaultdict(lambda: None)
key_handlers['+']=operator.iadd(tickrate,1)
key_handlers['-']=operator.iadd(tickrate,-1)
Tickrate当然是全球性的。后来,我有类似的东西(我现在已经丢失了原始代码,用elif链替换了它):
if event.type == KEYDOWN:
key_handlers[event.unicode]()
...这不起作用,因为iadd只对in-place-add-s为可变类型,而int是不可变的。你不能在lambdas中分配东西,我宁愿没有一个函数来添加一个数字。如何在不牺牲Pythonic-ness的情况下解决这个问题?
答案 0 :(得分:0)
您可以使用您选择的默认值暂存defaultdict
。例如:
from collections import defaultdict
key_handlers = defaultdict(lambda : tickrate)
但是,从上面的例子中,我认为你真正想要的是一个更新全局状态的dict
方法。这是从上面@utdemir的评论中扩展出来的:
global tickrate
key_kandlers = {'+': lambda : 1, '-': lambda : -1}
func = key_handlers.get(event.type, None)
if func is not None:
tickrate += func()
上面的示例限制您只是操纵tickrate
状态,因此您可能需要更强大的功能。但是上面使用event.type
来获取函数的一般形式非常有用。