Ваша проблема в том, что тело лямбды должно быть выражением, а присваивание - выражением (сильное глубокое различие в Python). Если вы настаиваете на совершении lambda
s, вы встретите много таких случаев и узнаете обходные пути (обычно есть один, хотя и не всегда), например, в этом случае:
name = property(lambda self: self.__name,
lambda self, value: setattr(self,
'_X__name',
self.process_value(value)))
т.е. используйте встроенный setattr
(который является функцией и, следовательно, приемлемым в теле lambda
), а не присваивание (которое является оператором и, следовательно, недопустимым в теле lambda
).
Редактировать : Вам также необходимо вручную выполнить изменение имени для атрибута с двойным подчеркиванием (изменив значение __name
на _X__name
, когда вы находитесь в классе X), где представлено имя атрибута как строка в кавычках, как это должно быть в setattr, так как компилятор Pyhon делает искажение имени только для подходящих идентификаторов, а не для строковых литералов.