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

Bas*_*asj 1 python variables 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)
Run Code Online (Sandbox Code Playgroud)

是多余的,可以替换为:

def xsetter(value):
    obj.x = value

f('abc', lambda: xsetter(1))
f('def', lambda: xsetter(2))
Run Code Online (Sandbox Code Playgroud)

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

f('abc', lambda: obj.x = 1)
f('def', lambda: obj.x = 2)
Run Code Online (Sandbox Code Playgroud)

这里它产生一个错误:

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

che*_*ner 6

在 lambda 表达式中(完全)不可能对名称进行赋值。但是,您正在分配一个由函数处理的属性setattr

f('abc', lambda: setattr(obj, 'x', 1))
Run Code Online (Sandbox Code Playgroud)

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

from functools import partial

f('abc', partial(obj.__setattr__, 'x', 1))
Run Code Online (Sandbox Code Playgroud)

  • 不,因为“obj.x”首先会被评估为属性的当前值(或引发“AttributeError”),而不是被视为左值。 (2认同)