Qualquer biblioteca de suporte AOP para Python?
Pergunta
Eu estou tentando usar alguns AOP na minha programação Python, mas eu não tenho nenhuma experiência das várias bibliotecas que existem.
Então, minha pergunta é:
Existe suporte que AOP para Python? E quais são as vantagens das bibliotecas diferentes entre eles?
Editar
Eu encontrei alguns, mas eu não sei como eles se comparam:
Editar 2
Em que contexto eu vou usá-los?
Eu tenho dois aplicativos, escrito em Python, que têm tipicamente métodos que computam os impostos e outras coisas de dinheiro. Eu gostaria de ser capaz de escrever um "esqueleto" de uma funcionalidade, e personalizá-lo em tempo de execução, por exemplo, mudando a forma como os impostos locais são aplicadas (por país ou estado, ou cidade, etc.) sem ter que sobrecarregar o pilha completa.
Solução
Edit: Eu já não manter pytilities e tem sido sem manutenção durante anos. Você pode querer considerar uma das outras respostas em vez ou esta lista na Wikipedia .
Outra biblioteca AOP para Python seria pytilities
( Documentação ; svn repo ). Ele é atualmente o mais poderoso (tanto quanto eu sei).
Suas características são:
- fazer aulas Aspect reutilizável
- aplicar vários aspectos a uma instância ou classe
- aspectos cancelar a aplicação de uma instância / class
- adicionar novos atributos a uma instância usando um aspecto
- se candidatar conselho para todos os atributos de uma instância / class
- ...
Ele também tem outras guloseimas, como alguns descritores especiais (consulte a documentação)
Outras dicas
link Sé de S. Lott sobre Python decoradores há alguns bons exemplos, e veja as definição de PEP para decoradores .
Python teve AOP desde o início, ele só não tinha um nome impressionante. Em Python 2.4 foi adicionada a sintaxe decorador, o que torna a aplicação decoradores muito agradável sintaticamente.
Talvez se você deseja aplicar decoradores com base em regras que você precisa de uma biblioteca, mas se você estiver disposto para marcar as funções relevantes / métodos quando você declará-los você provavelmente não.
Aqui está um exemplo de um decorador simples caching (eu escrevi para esta pergunta ):
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
Em Python, programação orientada para o aspecto tipicamente consiste em modificar dinamicamente classes e instâncias em tempo de execução, o que é vulgarmente referido como monkeypatching. Em uma resposta a outra pergunta AOP, resumi alguns destes casos de uso para AOP em Python .
Usando anotações não é realmente AOP, porque o processo de tecelagem é um pouco hard-coded.
Existem várias estruturas AOP em Python (eu contei e comparados 8 deles, dos quais Aspyct
foi o vencedor claro).
Vou publicar um papel com minhas descobertas em uma das próximas conferências, incluindo um caso da indústria da vida real de uso.
Eu começaria com a Python Decorator Biblioteca . Muito do que é AOP tipo de coisa.
E sobre a licença BSD python-aspectlib ?
estado de implementação
funções tecelagem, métodos, instâncias e classes é concluída.