tags:

views:

1263

answers:

4

I am trying to use some AOP in my Python programming, but I do not have any experience of the various libs that exists. So my question is :

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

Edit : I've found some, but I don't know how they compare :

Edit2 : In which context will I use this ? I have two applications, written in Python, which have typically methods which compute taxes and other money things. I'd like to be able to write a "skeleton" of a functionnality, and customize it at runtime, for example changing the way local taxes are applied (by country, or state, or city, etc.) without having to overload the full stack.

+2  A: 

I'd start with the Python Decorator Library. Much of that is AOP kind of stuff.

S.Lott
+2  A: 

In Python, aspect-oriented programming typically consists of dynamically modifying classes and instances at runtime, which is commonly referred to as monkeypatching. In an answer to another AOP question, I summarized some of these use cases for AOP in Python.

Eli Courtwright
+2  A: 

See S.Lott's link about Python decorators for some great examples, and see the defining PEP for decorators.

Python had AOP since the beginning, it just didn't have an impressive name. In Python 2.4 the decorator syntax was added, which makes applying decorators very nice syntactically.

Maybe if you want to apply decorators based on rules you would need a library, but if you're willing to mark the relevant functions/methods when you declare them you probably don't.

Here's an example for a simple caching decorator (I wrote it for this question):

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
orip
Isn't this memoizing with a different name?
S.Lott
Yes it is. I think memoization is a fancy name for a simple concept that can make it harder to understand. I have similar feelings about the term 'AOP'.
orip
+1  A: 

Using annotations is not really AOP, because the weaving process is somewhat hard-coded.

There are several AOP frameworks in Python (I counted and compared 8 of them, of which Aspyct was the clear winner). I'm going to publish a paper with my findings on one of the next conferences, including a real-life industry use case.

Regards,

A.

Arx
+1 good point. Is your paper available ?
neuro