Декоратор для не вызванного свойства

#python

#python

Вопрос:

Рассмотрим этот декоратор:

 from functools import wraps

def non_null(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print("Test")
        assert all(not a is None for a in args)
        return func(*args, *kwargs)

    return wrapper
  

Вокруг средства установки свойства функции класса:

 @non_null
    @foo.setter 
    def foo(self, argument):
        print("Setting")
        self._a = argument
  

Если используется декоратор non_null, ни функция, ни декоратор не вызываются.

Ответ №1:

Похоже, что @foo.setter это должен быть самый внешний декоратор:

 @foo.setter 
@non_null
def foo(self, argument):
    print("Setting")
    self._a = argument
  

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

Комментарии:

1. Это решило проблему! Кстати, как именно вы это обнаружили?

2. При просмотре того, что было foo атрибутом класса, я увидел, что это больше не свойство, которое позволяет думать, что foo.getter не было обработано. И причиной мог быть только другой декоратор, поэтому я попытался изменить порядок…

3. Спасибо за вашу помощь.