2016-06-28 6 views
1

Я хочу явную замену общей идиомы декоратора.Мета-декоратор с параметрами, определенными в явных функциях

Существует умный одна линии декоратор, которая была copy-pasted без объяснения причин во многих кодовых базах в течение многих лет:

decorator_with_args = lambda decorator: lambda *args, **kwargs: lambda func: decorator(func, *args, **kwargs) 

Моя проблема с этим именно that it is clever: она ничего не объясняет о том, что он делает, имеет многие движущиеся части, которые не названы, неочевидны и не имеют выразительности.

Даже widely-cited ActiveState recipe от Peter Hunt от 2005 года не дает никаких указаний относительно того, что это делается внутри, и какими должны быть названия его частей.

Я хотел бы видеть более понятную Pythonic, более явную и выразительную замену ее составными частями.

ответ

1

Поскольку я не знаю, как детали оригинала предназначены для работы, я, возможно, это неправильно:

import functools 

def decorator_with_arguments(decorator): 
    """ Wrap a decorator, allowing it to accept arbitrary arguments. """ 

    @functools.wraps(decorator) 
    def wrapper(*args, **kwargs): 
     """ The resulting decorator that accepts arbitrary arguments. """ 

     def _function(func): 
      """ Invoke the original decorator with the arguments. """ 
      return decorator(func, *args, **kwargs) 

     return _function 

    return wrapper 

Пожалуйста, предложить лучшие имена для этих частей, а также указать, какие ошибки (т.е. другое поведение от оригинала).