Какая-либо вспомогательная библиотека AOP для Python?

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

28
задан nbro 12 March 2017 в 16:11
поделиться

4 ответа

См. ссылку 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'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
24
ответ дан Community 28 November 2019 в 03:26
поделиться

Я запустил бы с Библиотека Декоратора Python . Большая часть этого является видом AOP материала.

1
ответ дан S.Lott 28 November 2019 в 03:26
поделиться

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

6
ответ дан Community 28 November 2019 в 03:26
поделиться

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

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

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

3
ответ дан 28 November 2019 в 03:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: