/ / Ozdobte python metódu s voliteľným argumentom - python, decorator

Ozdobte metódu python s voliteľným argumentom - python, dekoratér

Mám Python triedy s mnohými metódami s podpisom:

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

Tj. metódy majú premenlivý (1-3) počet pozičných argumentov a voliteľný argument sa pretína s predvolenou hodnotou False. Chcel by som vyzdvihnúť všetky tieto metódy dekoratérom, ktorý nehľadí na hodnotu parametra prelínania a podľa toho vykoná rôzne akcie. Môj súčasný prístup je niečo takéto:

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)

Ale dostať voliteľný argument pretínajú do* args a ** kwargs mix v dekoratéri nie je v súčasnosti žiadna radosť. Mohol by som obetovať funkčnosť ** kwargs, ak to problém ľahšie vyrieši. Nejaké návrhy?

Joakim

odpovede:

2 pre odpoveď č. 1

Predpokladám, že pretínanie bude vždy odovzdané ako argument kľúčového slova. V takom prípade by ste to jednoducho mohli urobiť vo vnútri dekoratéra

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