/ / Decorar el método de python con argumento opcional - python, decorator

Decora el método de Python con un argumento opcional: python, decorator

Tengo una clase de Python con muchos métodos con firma:

def select_xxx(self, arg1 , arg2 , .. argn, intersect = False)

Es decir. los métodos tienen un número variable (1-3) de argumentos posicionales, y un argumento opcional se interseca con el valor predeterminado False. Me gustaría decorar todos estos métodos con un decorador que inspeccione el valor del parámetro de intersección y realice diferentes acciones en consecuencia. Mi enfoque actual es algo como esto:

def select_decorator(select_method):

def select_wrapper( self , *args, intersect = False , **kwargs)
if intersect:
# Special init code for intersect == True
select_method( self , *args , **kwargs)
else:
# Normal call path for intersect == False
select_method( self , *args , **kwargs)

return select_wrapper

@select_decorator
select_xxx( self , arg1 , arg2 , intersect = False)

Pero conseguir que el argumento opcional se intersecte enLa mezcla de * args y ** kwargs dentro del decorador actualmente no es una alegría. Podría sacrificar la funcionalidad ** kwargs si eso hace que el problema sea más fácil de resolver. ¿Alguna sugerencia?

Joakim

Respuestas

2 para la respuesta № 1

Supongo que la intersección siempre se pasará como argumento de palabra clave. En cuyo caso simplemente podrías hacer esto dentro de ti decorador.

def select_decorator(select_method):

def select_wrapper( self , *args, **kwargs):
intersect = kwargs.has_key("intersect") and kwargs["intersect"]
if intersect:
# Special init code for intersect == True
select_method( self , *args , **kwargs)
else:
# Normal call path for intersect == False
select_method( self , *args , **kwargs)
return select_wrapper