Любая библиотека поддержки AOP для Python?

Я пытаюсь использовать некоторые AOP в моем программировании на Python, но у меня нет опыта существования различных библиотек.

Итак, мой вопрос:

Какая поддержка AOP существует для Python? И каковы преимущества разных библиотек между ними?


Изменить

Я нашел некоторые, но я не знаю, как они сравниваются:

Изменить 2

В каком контексте я буду использовать их?

У меня есть два приложения, написанные на Python, которые обычно используют методы, которые вычисляют налоги и другие деньги. Я бы хотел написать "скелет" функциональности и настроить его во время выполнения, например, изменить способ применения локальных налогов (по стране, штату или городу и т.д.), Не перегружая полный стек.

Ответы

Ответ 1

Изменение: я больше не поддерживаю pytilities, и он не поддерживается в течение многих лет. Вы можете рассмотреть один из других ответов или этот список в Википедии.

Другая библиотека AOP для python - это pytilities (Documentation; svn repo). На данный момент это самый мощный (насколько я знаю).

Его особенности:

  • сделать многоразовые классы Aspect
  • применять несколько аспектов к экземпляру или классу
  • не применять аспекты к экземпляру/классу
  • добавить новые атрибуты в экземпляр, используя аспект
  • применять рекомендации ко всем атрибутам экземпляра/класса
  • ...

У этого также есть другие полезности, такие как некоторые специальные дескрипторы (см. Документацию)

Ответ 2

См. ссылку S.Lott о декораторах 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 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

Ответ 3

В Python аспектно-ориентированное программирование обычно состоит из динамически модифицирующих классов и экземпляров во время выполнения, которое обычно называют monkeypatching. В ответе на другой вопрос АОП я обобщил некоторые из этих вариантов использования AOP в Python.

Ответ 4

Использование аннотаций на самом деле не АОП, потому что процесс ткачества несколько жестко закодирован.

В Python существует несколько фреймов AOP (я подсчитал и сравнил 8 из них, из которых Aspyct был явным победителем).

Я собираюсь опубликовать документ с моими выводами на одной из следующих конференций, включая реальный случай использования в промышленности.

Ответ 6

Как насчет лицензии BSD python-aspectlib?

Статус выполнения

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