Вызов средства установки свойств внутри лямбда-выражения

#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