2012-03-05 4 views
2

У меня есть класс 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) 

Но получить дополнительный аргумент пересекаться в * арг и ** kwargs смешивать внутри декоратор в настоящее время нет радости. Я мог бы пожертвовать функциональностью ** kwargs, если это облегчит задачу. Какие-либо предложения?

Йоаким

+0

Если вам нужна дополнительная помощь с декораторами и аннотациями, см. Мой блог здесь. http://blog.mattalcock.com/2013/1/5/decorates-and-annotations/ –

ответ

2

Я предполагаю, пересекающий всегда будет принят в качестве ключевого слова аргумента. В этом случае вы могли бы просто сделать это внутри вас, декоратор

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 
+0

'или False' ничего не делает. –

+0

Thats True. Отредактировано сейчас – spicavigo

+0

Спасибо, что сработало красиво :-) – user422005

Смежные вопросы