Обнаружение декоратора в Python

В python можно ли определить, есть ли декоратор для другой функции?

В частности, я пытаюсь (в django) написать промежуточное программное обеспечение, которое будет определять, было ли обрабатываемое представление заключено в декораторе @login_required.

class SomeMiddleware(object):

    def process_view(self, request, view_func, view_args, view_kwargs):
        if has_decorator(view_func):
            print "this view was decorated"

То, что я пытаюсь заполнить, это часть «has_decorator»....

Это возможно?


person Brant    schedule 01.04.2011    source источник
comment
Посмотрите так: stackoverflow.com/questions/3232024/   -  person lecodesportif    schedule 01.04.2011
comment
Ответ на этот вопрос — плохая идея. Не придумывайте свою особую магию для применения декораторов.   -  person Glenn Maynard    schedule 01.04.2011
comment
Спасибо за ссылку, но это не совсем то, что я искал. Я надеялся, что для обнаружения декоратора использовалась какая-то функция или атрибут Python.   -  person Brant    schedule 01.04.2011
comment
В общем, почти наверняка нет. Декоратор — это просто вызываемый объект, который берет некоторую функцию и заменяет ее новой. Если вы что-то знаете о декораторах, которые могут быть применены, вы можете проверить их эффекты.   -  person Thomas K    schedule 01.04.2011
comment
Это то, что я нахожу ...   -  person Brant    schedule 01.04.2011


Ответы (1)


Небольшое шаманство в оболочке показывает, что атрибут func_closure в функции пуст для недекорированных функций, но содержит данные в декорированных функциях. Не уверен на 100%, что это верно всегда, но, возможно, это сработает для вас.

person ojii    schedule 01.04.2011
comment
Это очень удобно... в конечном итоге возвращается ко мне с набором ячеек... Однако мне трудно взаимодействовать с этими ячейками. Кажется, я не могу найти примеры того, как вытащить атрибуты/методы из ячеек... какой-нибудь совет? - person Brant; 04.04.2011