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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top