2015-12-27 3 views
0

У меня есть функция, украшенной как это:Python декоратора с аргументами, которые зависят от декорированной функции

@do_something(cache_key=CACHE_ID ,timeout=CACHE_ID_TIMEOUT)   
def get_something_from_cache(): 
    ... 
    ... 
    ... 
    return result 

мой декоратор:

def do_something(function=None, cache_key='', timeout=300): 

    def decorator(func): 
     @wraps(func, assigned=available_attrs(func)) 
     def inner(*args, **kwargs): 
      ... 
      ... 
      ... 
    return decorator if function is None else decorator(function) 

я хочу, чтобы иметь возможность иметь различные «cache_key» зависит декорированный вход функции. что-то вроде:

@do_something(cache_key=CACHE_ID.format(att) ,timeout=CACHE_ID_TIMEOUT)   
def get_something_from_cache(att): 
    ... 
    ... 
    ... 
    return result 

Возможно ли это?

ответ

2

Nope.

Декораторы функций выполняются сразу после того, как определена функция декорирования. att не существует до тех пор, пока не будет вызвана функция, которая может быть длинной после определения, или никогда вообще.

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