Python的任何AOP支持库?

Any AOP support library for Python?

我正试图在我的Python编程中使用一些AOP,但我对现有的各种库没有任何经验。

所以我的问题是:

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

号编辑

我发现了一些,但我不知道它们是如何比较的:

  • 异步CT
  • 针对python的轻量级AOP

编辑2

在哪种情况下我将使用这些?

我有两个用python编写的应用程序,它们通常有计算税收和其他货币的方法。我希望能够编写一个功能的"框架",并在运行时对其进行自定义,例如更改应用地方税的方式(按国家、州或城市等),而不必使整个堆栈过载。


请参阅s.lott关于python decorators的链接以获得一些很好的示例,并参阅decorators的定义PEP。

Python从一开始就有AOP,只是没有一个令人印象深刻的名字。在python 2.4中添加了decorator语法,这使得在语法上应用decorator非常好。

如果您希望根据规则应用装饰器,可能需要一个库,但是如果您愿意在声明相关函数/方法时标记它们,则可能不需要。

下面是一个简单缓存装饰器的示例(我为这个问题编写了它):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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


编辑:我不再维护副本,它已经被取消维护多年了。你可以考虑用另一个答案或者维基百科上的这个列表来代替。

另一个针对python的AOP库是pytilities(文档;svn repo)。它是目前最强大的(据我所知)。

其特点是:

  • 生成可重用的方面类
  • 对实例或类应用多个方面
  • 不应用于实例/类的方面
  • 使用方面向实例添加新属性
  • 将建议应用于实例/类的所有属性

它还具有其他优点,例如一些特殊的描述符(参见文档)


在Python中,面向方面的编程通常包括在运行时动态修改类和实例,这通常被称为MonkeyPatching。在另一个AOP问题的答案中,我总结了在Python中AOP的一些用例。


使用注释并不是真正的AOP,因为编织过程有点硬编码。

在python中有几个AOP框架(我计算并比较了其中的8个,其中Aspyct是明显的赢家)。

我将发表一篇关于下一个会议的研究结果的论文,包括一个真实的行业用例。


BSD许可的python aspectlib怎么样?

Implementation status

Weaving functions, methods, instances and classes is completed.


我将从python decorator库开始。大部分都是AOP类型的东西。