Прежде чем я начну, позвольте мне сказать, что я знаю, что то, что я пытаюсь сделать, является неортодоксальным, и, возможно, люди будут испытывать отвращение ко всей концепции, однако мне любопытно, возможно ли это.

Итак, вот в чем вопрос.

Дан экземпляр k класса K, у которого есть целочисленный атрибут z, инициализированный нулем; можем ли мы вызвать лямбда-функцию из k, которая изменяет k.z?

Примером может быть простое увеличение k.z с 0 до 1.

Я немного поигрался, чтобы увидеть, смогу ли я заставить его работать, и, несмотря на успех, я включил часть этого кода ниже.

class K():
  def __init__(self):
    self.z = 0
    self.functions = [
        lambda : "Returns string",
        lambda : self.z, # returns value of z
        # lambda : self.z+=1, # Fails to execute
    ]

k = K()
print(k.functions[0]())
print(k.functions[1]())
print(k.z)
0
John Forbes 16 Апр 2020 в 07:29

1 ответ

Лучший ответ

Выражения lambda могут иметь внутри только простые выражения. В этом случае вы можете:

lambda : setattr(self, 'z', self.z + 1)

Но это, очевидно, очень некрасиво и не дает вам никакой пользы перед:

def _update_z(): self.z += 1
self.functions = [
    lambda : "Returns string",
    lambda : self.z, # returns value of z,
    _update_z
]
2
John Forbes 16 Апр 2020 в 05:27