2010-04-24 12 views
35

Estoy implementando un servicio web RESTful en python y me gustaría agregar algunas funciones de registro QOS al interceptar llamadas a funciones y registrar su tiempo de ejecución, etc.Llamadas a métodos de interceptación en Python

Básicamente pensé en una clase de la que todos los demás servicios pueden heredar, que automáticamente anula las implementaciones de métodos por defecto y las envuelve en una función de registrador. ¿Cuál es la mejor manera de lograr esto?

Respuesta

43

¿Algo como esto? Esto añade implícitamente un decorador a su método (también se puede hacer un decorador explícita basada en esto si usted prefiere que):

class Foo(object): 
    def __getattribute__(self,name): 
     attr = object.__getattribute__(self, name) 
     if hasattr(attr, '__call__'): 
      def newfunc(*args, **kwargs): 
       print('before calling %s' %attr.__name__) 
       result = attr(*args, **kwargs) 
       print('done calling %s' %attr.__name__) 
       return result 
      return newfunc 
     else: 
      return attr 

cuando se intenta ahora algo como:

class Bar(Foo): 
    def myFunc(self, data): 
     print("myFunc: %s"% data) 

bar = Bar() 
bar.myFunc(5) 

Obtendrá :

before calling myFunc 
myFunc: 5 
done calling myFunc 
+0

Este código es un poco extraño en el sentido de que si 'attr' no tiene un atributo' __call__' (que, dicho sea de paso, es ligeramente diferente de no ser llamado), esto da un 'NameError' en lugar de devolver el atributo. Además, 'attr .__ call __ (* args, ** kwargs)' usualmente se deletrea 'attr (* args, ** kwargs)'. –

+0

perfecto, justo lo que necesito. He hecho algo similar, pero en el método init y de alguna manera lo arruiné, pero tu enfoque funcionó como un hechizo. Gracias. –

+0

@Mike: de hecho, si olvidó la cláusula else. Mezclaba python2.6 y 3 por cierto, por lo tanto, no usaba el programador invocable. En 3, realmente no conozco una forma más directa de verificar esto. – KillianDS

4

¿Qué sucede si escribe un decorador en cada función? Aquí hay un ejemplo en python's wiki.

¿Utiliza cualquier marco web para hacer su servicio web? ¿O estás haciendo todo a mano?

+3

Esta es la forma más explícita y no mágica de hacer las cosas. –

+2

Es un ejemplo, para entender cómo funciona. Un ejemplo por definición no es algo mágico – dzen

Cuestiones relacionadas