为变量设置值的单行 lambda 函数



创建设置变量的回调函数obj.x如下所示:

def f(button, callback):
pass
def callback1():
obj.x = 1
def callback2():
obj.x = 2
class Obj: 
pass
obj = Obj()
f('abc', callback2)
f('def', callback1)

是多余的,可以替换为:

def xsetter(value):
obj.x = value
f('abc', lambda: xsetter(1))
f('def', lambda: xsetter(2))

问题:有没有更简单,而不必为x定义一个二传手?是否可能类似于以下内容?

f('abc', lambda: obj.x = 1)
f('def', lambda: obj.x = 2)

这里它会产生一个错误:

语法错误:lambda 不能包含赋值

在lambda 表达式中不可能(干净地(对名称进行赋值。但是,您正在分配给一个属性,该属性setattr函数处理。

f('abc', lambda: setattr(obj, 'x', 1))

还可以使用functools.partial将对象的__setattr__方法"部分"应用于所需的参数。

from functools import partial
f('abc', partial(obj.__setattr__, 'x', 1))

最新更新