Любая библиотека поддержки АОП для Python?
Я пытаюсь использовать AOP в своем программировании на Python, но у меня нет опыта работы с различными существующими библиотеками.
Итак, мой вопрос:
Какая поддержка АОП существует для Python? И каковы преимущества разных библиотек между ними?
редактировать
Я нашел некоторые, но я не знаю, как они сравниваются:
Редактировать 2
В каком контексте я буду использовать это?
У меня есть два приложения, написанные на Python, в которых обычно есть методы, которые вычисляют налоги и другие денежные вещи. Я хотел бы иметь возможность написать "скелет" функциональности и настроить его во время выполнения, например, изменить способ применения местных налогов (по стране, штату, городу и т. Д.), Не перегружая полный стек
6 ответов
Другая библиотека AOP для Python будет pytilities
, На данный момент это самый мощный (насколько я знаю).
Его особенности:
- сделать многоразовые классы Aspect
- применять несколько аспектов к экземпляру или классу
- не применять аспекты к экземпляру / классу
- добавить новые атрибуты в экземпляр, используя аспект
- применять рекомендации ко всем атрибутам экземпляра / класса
- ...
У этого также есть другие полезности, такие как некоторые специальные дескрипторы (см. Документацию)
Посмотрите ссылку С.Лотта о Python-декораторах для некоторых замечательных примеров и посмотрите определение PEP для декораторов.
У Python с самого начала был AOP, но у него не было впечатляющего названия. В 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
В Python аспектно-ориентированное программирование, как правило, состоит из динамически изменяемых классов и экземпляров во время выполнения, что обычно называют monkeypatching. В ответе на другой вопрос об АОП я суммировал некоторые из этих вариантов использования для АОП в Python.
Использование аннотаций на самом деле не АОП, потому что процесс плетения несколько жестко запрограммирован.
В Python есть несколько AOP-фреймворков (я посчитал и сравнил 8 из них, из которых Aspyct
был явным победителем).
Я собираюсь опубликовать статью с моими выводами на одной из следующих конференций, включая реальный пример использования в промышленности.
Как насчет BSD-лицензированного python-aspectlib?
Статус реализации
Плетение функций, методов, экземпляров и классов завершено.
Я бы начал с библиотеки Python Decorator. Многое из этого - АОП.