/ / Прикрасити метод python з додатковим аргументом - python, decorator

Прикрасьте метод python з необов'язковим аргументом - python, декоратор

У мене є клас Python з багатьма методами з підписом:

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

Тобто. методи мають різні (1-3) числа позиційних аргументів, а необов'язковий аргумент перетинається з значенням за замовчуванням False. Я хотів би прикрасити всі ці методи декоратором, який буде визначати значення параметра перетинання і відповідно приймати різні дії. Мій поточний підхід такий:

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)

Але отримання додаткового аргументу перетинається в* args і ** kwargs mix всередині декоратора в даний час не радість. Я можу пожертвувати функціональністю ** kwargs, якщо це полегшує вирішення проблеми. Будь-які пропозиції?

Йоаким

Відповіді:

2 для відповіді № 1

Я вважаю, що перетинання завжди буде передано як аргумент ключового слова. У цьому випадку ви можете просто зробити це всередині вашого декоратора

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