/ / Decore o método python com argumento opcional - python, decorator

Decore o método python com argumento opcional - python, decorator

Eu tenho uma classe Python com muitos métodos com assinatura:

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

Ou seja os métodos têm um número variável (1-3) de argumentos posicionais e um argumento opcional cruza com o valor padrão False. Eu gostaria de decorar todos esses métodos com um decorador que irá inseparar o valor do parâmetro de intersecção e tomar ações diferentes de acordo. Minha abordagem atual é algo assim:

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)

Mas obter o argumento opcional se cruzamO * args e ** kwargs mix dentro do decorador atualmente não é nenhuma alegria. Eu poderia sacrificar a funcionalidade ** kwargs se isso torna o problema mais fácil de resolver. Alguma sugestão?

Joakim

Respostas:

2 para resposta № 1

Estou assumindo que intersect será sempre passado como argumento de palavra-chave. Nesse caso, você poderia simplesmente fazer isso dentro de você 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