Я пытаюсь использовать АОП в своем программировании на Python, но у меня нет опыта работы с различными существующими библиотеками.
Итак, мой вопрос:
What AOP support exists for Python? And what are the advantages of the differents libraries between them?
Я нашел несколько, но не знаю, как они сравниваются:
В каком контексте я буду их использовать?
У меня есть два приложения, написанные на Python, в которых обычно есть методы для расчета налогов и других денежных операций. Я хотел бы иметь возможность написать «скелет» функциональности и настроить его во время выполнения, например, изменить способ применения местных налогов (по стране, штату, городу и т. д.) Без необходимости перегружать полный стек.






Я бы начал с Библиотека декораторов Python. По большей части это АОП.
Нет, это не так. Украшение - это не АОП (см. Мой комментарий выше).
@RaffiKhatchadourian: "Выше"? Ответы можно отсортировать по разным порядкам. (Активный, Старейший, Голоса). «Выше» вообще ничего не значит. О чем ты говоришь?
Сверху: у вас такое же чувство по поводу АОП, потому что ваш пример включает только один аспект АОП, то есть количественную оценку. Отсутствует забывчивость (см. citeseerx.ist.psu.edu/viewdoc/…).
В Python аспектно-ориентированное программирование обычно состоит из динамического изменения классов и экземпляров во время выполнения, что обычно называется патчингом обезьяны. Отвечая на другой вопрос АОП, я резюмировал некоторые из этих варианты использования АОП в Python.
См. Ссылку С.Лотта о декораторах Python для некоторых отличных примеров и см. определение PEP для декораторов.
У Python с самого начала был АОП, просто у него не было впечатляющего имени. В Python 2.4 был добавлен синтаксис декоратора, что делает применение декораторов очень приятным синтаксически.
Возможно, если вы хотите применить декораторы на основе правил, вам понадобится библиотека, но если вы хотите пометить соответствующие функции / методы при их объявлении, вы, вероятно, этого не сделаете.
Вот пример простого декоратора кеширования (я написал его для этот вопрос):
import pickle, functools
def cache(f):
_cache = {}
def wrapper(*args, **kwargs):
key = pickle.dumps((args, kwargs))
if key not in _cache:
_cache[key] = f(*args, **kwargs) # call the wrapped function, save in cache
return _cache[key] # read value from cache
functools.update_wrapper(wrapper, f) # update wrapper's metadata
return wrapper
import time
@cache
def foo(n):
time.sleep(2)
return n*2
foo(10) # first call with parameter 10, sleeps
foo(10) # returns immediately
Разве это мемоизирование не под другим названием?
Да, это так. Я думаю, что мемоизация - это причудливое название для простой концепции, которая может усложнить понимание. У меня похожие чувства по поводу термина «АОП».
@orip У вас такое же чувство по поводу АОП, потому что ваш пример включает только один аспект АОП, то есть количественную оценку. Отсутствует забывчивость (см. citeseerx.ist.psu.edu/viewdoc/…).
@ Раффи нет. Я ценю ваше различие, но считаю, что упоминаю забывчивость в более доступных терминах (применение на основе правил) и признаю, что в этом случае вам понадобится структура. Мои чувства по поводу перегруженной терминологии в АОП на самом деле развились после того, как я хорошо с ней знаком.
Я не уверен, что украшение и АОП - это одно и то же. IMHO, с AOP вы должны иметь возможность добавлять новые поведения к существующему коду без, изменяя существующий код.
@rds В Python вы можете просто исправить существующий код, не изменяя его напрямую. Не нужно замысловатых терминов и техник ...
@schlamar, АОП - это не исправление существующего кода без его непосредственного изменения, а инкапсуляция фрагментов кода, которые «пересекают» (т. е. влияют) на другие единицы инкапсуляции (например, классы) в их собственные единицы (обычно, «аспекты» в зависимости на каком инструменте вы используете). Декораторы в Python или даже исправление обезьяны могут быть способом добиться этого, но этого далеко не достаточно.
@Bruno: False - в Python есть много способов добиться этого, и, безусловно, их достаточно. Поскольку язык позволяет извлекать объекты кода (не говоря уже о байт-коде, но о классах, модулях и функциях) и изменять их во время выполнения, чаще всего добавляя и пост-ожидающие поведения, но не ограничиваясь этим, это дело вкуса. прийти с любым подходом, который вам нравится в библиотеке / фреймворке.
@jsbueno Я говорил, что использование декораторов и исправление обезьян не является само по себе АОП. Конечно, низкоуровневые механизмы доступны прямо из коробки в Python, но Python (без внешних библиотек или процессора) не предоставляет вам конструкции более высокого уровня, как, например, в AspectJ. Этот ответ определенно не является примером АОП, это пример инструментария кода. В нем отсутствует принцип «забвения» (прочтите статью, упомянутую в предыдущем комментарии).
Использование аннотаций на самом деле не является АОП, потому что процесс плетения жестко запрограммирован.
В Python есть несколько фреймворков АОП (я насчитал и сравнил 8 из них, из которых Aspyct был явным победителем).
Я собираюсь опубликовать статью с моими выводами на одной из следующих конференций, включая практический пример использования в отрасли.
Это не ответ, а самореклама. -1
Приятно, что вы сравнили библиотеки - но где он, «Aspyct» и почему вы его рекомендуете?
Обновлено: я больше не поддерживаю pytilities, и он не поддерживался годами. Вы можете вместо этого рассмотреть один из других ответов или этот список в Википедии.
Другой библиотекой AOP для Python будет pytilities (Документация; svn репо). На данный момент он самый мощный (насколько мне известно).
Его особенности:
У него также есть другие полезности, такие как некоторые специальные дескрипторы (см. Документацию)
Ссылка в этом ответе кажется неработающей.
Исправлена ссылка (фиксированная ссылка появится после того, как правка будет проверена коллегами)
А как насчет лицензированного BSD python-aspectlib?
Implementation status
Weaving functions, methods, instances and classes is completed.
Это единственный ответ, который ссылается на библиотеку аспектов, которая, похоже, все еще работает с текущим Python. Получите мой голос за.
Спасибо @Nils - и даже в этом случае он немного устарел, но я не смог найти ничего более свежего / лучше поддерживаемого
ссылки больше не работают