#python #python-3.x #lambda #properties
#python #python-3.x #лямбда #свойства
Вопрос:
У меня есть класс, использующий декоратор свойств для установки / получения переменной.
class Application:
@property
def volume(self):
return self._volume
@volume.setter
def volume(self, value):
self._volume = value
Я хочу иметь возможность устанавливать объем приложения в лямбде.
Лямбды не допускают операторов, только выражения, поэтому это не так просто, как просто вызвать lambda application, value: application.volume = value
.
# Things I have tried and have not worked
lambda application, value: application.volume = value # Can't assign values in lambda
lambda application, value: application.volume(value) # Getter is run and turned into a callable
lambda application, value: (application.volume := value) # Assignment expression can not resolve application
Что я смог сделать, так это изменить способ определения свойства
class Application:
def get_volume(self):
return self._volume
def set_volume(self, value):
self._volume = value
volume = property(get_volume, set_volume)
Который затем позволяет мне напрямую вызывать функцию установки
lambda application, value: application.set_volume(value)
Однако это решение игнорирует пункт свойств. Есть ли способ вызвать установщик внутри лямбда-выражения, все еще используя теги декоратора свойств, или hack-y игнорирует свойство и использует установщик напрямую — лучший способ установить значение.
Ответ №1:
Использовать setattr
:
class Application:
@property
def volume(self):
print(f"volume get")
return self._volume
@volume.setter
def volume(self, value):
print(f"volume set {value}")
self._volume = value
update_volume = lambda application, value: setattr(application, "volume", value)
x = Application()
update_volume(x, 5)
print(x.volume)
С принтами:
volume set 5
volume get
5