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

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

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

What AOP support exists for Python? And what are the advantages of the differents libraries between them?


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

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

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

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

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

ссылки больше не работают

Adam Hughes 18.06.2020 18:04
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
29
1
15 598
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Я бы начал с Библиотека декораторов Python. По большей части это АОП.

Нет, это не так. Украшение - это не АОП (см. Мой комментарий выше).

Raffi Khatchadourian 06.10.2011 01:35

@RaffiKhatchadourian: "Выше"? Ответы можно отсортировать по разным порядкам. (Активный, Старейший, Голоса). «Выше» вообще ничего не значит. О чем ты говоришь?

S.Lott 06.10.2011 01:55

Сверху: у вас такое же чувство по поводу АОП, потому что ваш пример включает только один аспект АОП, то есть количественную оценку. Отсутствует забывчивость (см. citeseerx.ist.psu.edu/viewdoc/…).

Raffi Khatchadourian 06.10.2011 03:32

В 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

Разве это мемоизирование не под другим названием?

S.Lott 13.11.2008 23:17

Да, это так. Я думаю, что мемоизация - это причудливое название для простой концепции, которая может усложнить понимание. У меня похожие чувства по поводу термина «АОП».

orip 14.11.2008 12:43

@orip У вас такое же чувство по поводу АОП, потому что ваш пример включает только один аспект АОП, то есть количественную оценку. Отсутствует забывчивость (см. citeseerx.ist.psu.edu/viewdoc/…).

Raffi Khatchadourian 06.10.2011 01:34

@ Раффи нет. Я ценю ваше различие, но считаю, что упоминаю забывчивость в более доступных терминах (применение на основе правил) и признаю, что в этом случае вам понадобится структура. Мои чувства по поводу перегруженной терминологии в АОП на самом деле развились после того, как я хорошо с ней знаком.

orip 06.10.2011 12:55

Я не уверен, что украшение и АОП - это одно и то же. IMHO, с AOP вы должны иметь возможность добавлять новые поведения к существующему коду без, изменяя существующий код.

rds 15.11.2012 13:43

@rds В Python вы можете просто исправить существующий код, не изменяя его напрямую. Не нужно замысловатых терминов и техник ...

schlamar 22.04.2013 10:37

@schlamar, АОП - это не исправление существующего кода без его непосредственного изменения, а инкапсуляция фрагментов кода, которые «пересекают» (т. е. влияют) на другие единицы инкапсуляции (например, классы) в их собственные единицы (обычно, «аспекты» в зависимости на каком инструменте вы используете). Декораторы в Python или даже исправление обезьяны могут быть способом добиться этого, но этого далеко не достаточно.

Bruno 21.07.2014 18:07

@Bruno: False - в Python есть много способов добиться этого, и, безусловно, их достаточно. Поскольку язык позволяет извлекать объекты кода (не говоря уже о байт-коде, но о классах, модулях и функциях) и изменять их во время выполнения, чаще всего добавляя и пост-ожидающие поведения, но не ограничиваясь этим, это дело вкуса. прийти с любым подходом, который вам нравится в библиотеке / фреймворке.

jsbueno 02.12.2014 16:09

@jsbueno Я говорил, что использование декораторов и исправление обезьян не является само по себе АОП. Конечно, низкоуровневые механизмы доступны прямо из коробки в Python, но Python (без внешних библиотек или процессора) не предоставляет вам конструкции более высокого уровня, как, например, в AspectJ. Этот ответ определенно не является примером АОП, это пример инструментария кода. В нем отсутствует принцип «забвения» (прочтите статью, упомянутую в предыдущем комментарии).

Bruno 02.12.2014 16:28

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

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

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

Это не ответ, а самореклама. -1

Nils Lindemann 18.03.2018 17:11

Приятно, что вы сравнили библиотеки - но где он, «Aspyct» и почему вы его рекомендуете?

cslotty 06.08.2019 14:40
Ответ принят как подходящий

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

Другой библиотекой AOP для Python будет pytilities (Документация; svn репо). На данный момент он самый мощный (насколько мне известно).

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

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

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

Ссылка в этом ответе кажется неработающей.

NOhs 05.05.2019 14:55

Исправлена ​​ссылка (фиксированная ссылка появится после того, как правка будет проверена коллегами)

timdiels 21.05.2019 12:30

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

Implementation status

Weaving functions, methods, instances and classes is completed.

Это единственный ответ, который ссылается на библиотеку аспектов, которая, похоже, все еще работает с текущим Python. Получите мой голос за.

Nils Lindemann 18.03.2018 17:12

Спасибо @Nils - и даже в этом случае он немного устарел, но я не смог найти ничего более свежего / лучше поддерживаемого

astrojuanlu 19.03.2018 17:30

Другие вопросы по теме