Хотя мне нравится думать о себе как о достаточно компетентном кодере Python, одним из аспектов языка, который мне никогда не удавалось, являются декораторы.
Я знаю, что они (поверхностно), я прочитал учебники, примеры, вопросы по переполнению стека, и я понимаю синтаксис, могу написать свой, иногда использовать @classmethod и @staticmethod, но мне никогда не приходит в голову использовать декоратор, чтобы решить проблему в моем собственном коде Python. Я никогда не сталкиваюсь с проблемой, когда думаю: «Хм ... это похоже на работу декоратора!»
Итак, мне интересно, если вы, ребята, могли бы предложить несколько примеров, где вы использовали декораторы в своих собственных программах, и, надеюсь, у меня будет "А-ха!" момент и получить их.
functools.lru_cache
который делает именно то, что сказал Питер, начиная с Python 3.2, выпущенного в феврале 2011 года.Ответы:
Я использую декораторы в основном для целей синхронизации
источник
time.clock()
измеряет время процессора. Вы можете использоватьtime.time()
вместо этого, если вы хотите измерить время настенных часов.myFunction
запуска ...Я использовал их для синхронизации.
Как указано в комментариях, начиная с Python 2.5 вы можете использовать
with
оператор в сочетании сthreading.Lock
(илиmultiprocessing.Lock
начиная с версии 2.6) объектом, чтобы упростить реализацию декоратора до:Независимо от этого, вы затем используете это так:
По сути, он просто ставит
lock.acquire()
/lock.release()
по обе стороны от вызова функции.источник
Я использую декораторы для проверки типов параметров, которые передаются моим методам Python через некоторые RMI. Таким образом, вместо того, чтобы повторять один и тот же подсчет параметров, снова и снова вызывать исключение mumbo-jumbo.
Например, вместо:
Я просто заявляю:
и
accepts()
делает всю работу за меня.источник
@accepts
в PEP 318.isinstance()
функцию, как это делается в реализации декоратора PEP 318 . Поскольку егоclassinfo
аргумент может быть одного или нескольких типов, его использование также уменьшит (действительные) возражения @ Gustavo6046. Python также имеетNumber
абстрактный базовый класс, так что возможны очень общие тесты, подобныеisinstance(42, numbers.Number)
.Декораторы используются для всего, что вы хотите прозрачно «обернуть» дополнительными функциями.
Django использует их для переноса функций «требуется вход в систему» в функции просмотра , а также для регистрации функций фильтра .
Вы можете использовать декораторы классов для добавления именованных журналов в классы .
Любая достаточно общая функциональность, которую вы можете «привязать» к поведению существующего класса или функции, является хорошей игрой для украшения.
В группе новостей Python-Dev также обсуждаются варианты использования, на которые указывает PEP 318 - Декораторы для функций и методов .
источник
Для тестирования носа вы можете написать декоратор, который предоставляет функцию или метод модульного тестирования с несколькими наборами параметров:
источник
В библиотеке Twisted используются декораторы в сочетании с генераторами, чтобы создать иллюзию синхронности асинхронной функции. Например:
Используя это, код, который был бы разбит на тонну маленьких функций обратного вызова, может быть написан вполне естественно как единый блок, что делает его намного проще для понимания и сопровождения.
источник
Конечно, одно из очевидных применений - это регистрация:
источник
Я использую их главным образом для отладки (обертка вокруг функции, которая печатает свои аргументы и результат) и проверки (например, чтобы проверить, имеет ли аргумент правильный тип или, в случае веб-приложения, если пользователь имеет достаточные привилегии для вызова определенного метод).
источник
Я использую следующий декоратор для создания функции, обеспечивающей безопасность потока. Это делает код более читабельным. Он почти аналогичен предложенному Джоном Фухи, но различие заключается в том, что вы работаете с одной функцией и нет необходимости явно создавать объект блокировки.
источник
Декораторы используются либо для определения свойств функции, либо как шаблон, который ее изменяет; для них возможно, но нелогично возвращать совершенно разные функции. Глядя на другие ответы здесь, кажется, что одним из наиболее распространенных применений является ограничение области действия какого-либо другого процесса - будь то ведение журнала, профилирование, проверки безопасности и т. Д.
CherryPy использует диспетчеризацию объектов для сопоставления URL-адресов с объектами и, в конечном итоге, с методами. Декораторы этих методов сообщают, разрешено ли CherryPy даже использовать эти методы. Например, адаптировано из учебника :
источник
Я использовал их недавно, работая над веб-приложением для социальных сетей. Что касается сообщества / групп, я должен был дать разрешение на членство для создания нового обсуждения и ответить на сообщение, что вы должны быть участником этой конкретной группы. Итак, я написал декоратор
@membership_required
и поставил его там, где мне нужно, на мой взгляд.источник
Я использую этот декоратор, чтобы исправить параметр
это написано, когда я выполняю рефакторинг, некоторые функции должны передавать аргумент "wanN", но в моих старых кодах я передал только N или 'N'
источник
Декоратор может быть использован для простого создания переменных метода функции.
источник