Любая библиотека поддержки АОП для Python? - PullRequest
27 голосов
/ 13 ноября 2008

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

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

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


Редактировать

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

Редактировать 2

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

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

Ответы [ 6 ]

23 голосов
/ 13 ноября 2008

См. Ссылку С.Лотта о 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
7 голосов
/ 07 марта 2011

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

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

Его функции:

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

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

5 голосов
/ 13 ноября 2008

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

4 голосов
/ 21 мая 2010

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

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

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

1 голос
/ 15 декабря 2015

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

Статус реализации

Плетение функций, методов, экземпляров и классов завершено.

1 голос
/ 13 ноября 2008

Я бы начал с Python Decorator Library . Многое из этого - АОП.

...