在字典中存储lambda表达式

34

我一直在尝试用字符串作为键和lambda函数作为值来创建字典。我不确定我做错了什么,但我怀疑要么是我尝试将lambda存储在字典中的问题,要么就是我的lambda使用了快捷运算符。

代码:

dict = {
    'Applied_poison_rating_bonus': 
        (lambda target, magnitude: target.equipmentPoisonRatingBonus += magnitude)
}

引发的错误是SyntaxError: invalid syntax,指向我的+=。lambda表达式中不允许使用快捷操作符吗?或者我离正确的路径还有更远的距离吗?

为了保持理智,我省略了成百上千个非常相似的键值对(这不仅仅是一个小字典)。

编辑:

似乎我的问题在于尝试在lambda表达式中分配任何内容。然而,我的问题是如何让只知道此字典键的方法能够修改我(错误的)代码中定义的该字段?

某种形式的eval()调用会有所帮助吗?

最终编辑:

functools.partial()方法被推荐到了这个问题的扩展部分,经过研究,我相信它足以解决我的问题。


我刚刚遇到了一个奇怪的错误,当我将lambda函数存储在字典中时。显然,我通过lambda运行的函数的参数不可解地被更改了。不确定是否能够重现这个错误。如果可以的话,我会发布它。 - user3521099
1个回答

57

在表达式中不能使用赋值语句,而 lambda 只接受一个表达式。

否则,您可以很好地将 lambda 存储在字典中:

dict = {'Applied_poison_rating_bonus' : (lambda target, magnitude: target.equipmentPoisonRatingBonus + magnitude)}

上述的lambda仅返回结果,它不会就地更改target.equimentPoisonRatingBonus


1
@BlackVegetable:使用适当的函数,或者向“target”类添加一个方法。 - Martijn Pieters
1
我在这个字典中有大约150个类似的元素。因此,为每个元素使用适当的函数会破坏这个字典的目的。嗯... - BlackVegetable
2
@BlackVegetable:你不能使用一个通用函数吗?也许可以使用functools.partial()为每个字典条目提供参数。 - Martijn Pieters
2
我相信你已经充分回答了这个具体问题。我会自己更深入地研究functools.partial()。谢谢(5分钟内接受)。 - BlackVegetable
我知道这个线程很旧了。然而,使用字典构造器可以避免在lambda周围使用那些内部括号。这使得代码真的更容易阅读! - avans
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接