Escribo un decorador, y por varias razones molestas [0] sería conveniente comprobar si la función que está envolviendo se está definiendo por separado o como parte de una clase (y además qué clases es esa nueva clase subclasificación).Python: ¿puede un decorador determinar si una función se está definiendo dentro de una clase?
Por ejemplo:
def my_decorator(f):
defined_in_class = ??
print "%r: %s" %(f, defined_in_class)
@my_decorator
def foo(): pass
class Bar(object):
@my_decorator
def bar(self): pass
debe imprimir:
<function foo …>: False
<function bar …>: True
Además, tenga en cuenta lo siguiente:
- En los decoradores de puntos se aplicarán a la función seguirá siendo una función, no un método independiente, por lo que las pruebas para el método de instancia/sin consolidar (usando
typeof
oinspect
) no t trabajo. - Por favor, sólo ofrecen sugerencias que resuelven este problema - Soy consciente de que hay muchas maneras similares para llevar a cabo este fin (ex, utilizando un decorador de clase), pero me gustaría que sucedan en la decoración tiempo, después no.
[0]: específicamente, estoy escribiendo un decorador que hará que sea fácil hacer pruebas parametrizadas con nose
. Sin embargo, nose
no ejecuta generadores de prueba en las subclases de unittest.TestCase
, por lo que me gustaría que mi decorador pueda determinar si se está utilizando dentro de una subclase de TestCase
y falla con un error apropiado. La solución obvia: utilizar isinstance(self, TestCase)
antes de llamar a la función envuelta no funciona, porque la función envuelta necesita para ser un generador, que no se ejecuta en total.
Para los curiosos, este es el resultado: http://paste.pocoo.org/show/532430/ –