Есть некий набор декораторов(выполняющих схожие, но немного разные проверки), которые по своей логике работы могут применяться к одной функции несколько раз.
И вот, чтобы не накручивались тысячи обёрток на одну функцию(а там внутри функция может вызываться несколько раз) сразу приходит в голову идея: Добавляем к функции-обёртке некий атрибут, по которому в следующих декораторах можно будет определить, что функция уже декорирована и нужно просто дополнить/изменить параметры этой обёртки.
например:
def decorator(f):
if hasattr(f, 'iam_decorated'):
f.__params.add_new_params(something_other)
return f
else:
@wraps(f)
def newf(*args, **kwargs):
work_with_params( newf.__params )
return f(*args, **kwargs)
newf.iam_decorated = True
newf.__params = new_params(something)
return newf
Но, в таком случае может возникнуть ситуация, когда функцию продекорировали каким-то сторонним декоратором, который не в курсе про наши проблемы и потому функция, декорированная этим декоратором, при применении к ней нашего декоратора будет воспринята как новая функция, что не верно.
Тогда приходит в голову следующая идея: содержать хэш, ключом в котором будет какая-то информация, идентифицирующая функцию, а значением — нужные параметры.
Вопрос в том, есть ли такая информация, которая сохраняется даже после применения к функции какого-либо декоратора(т.е. переходит от оригинальной функции к функции-обёртке)?
Например, вроде как, принятой хорошей практикой является использование @functools.wraps. Т.е. копируется __name__ и __doc__. Вот казалось бы мне этого было бы достаточно(а на плохие декораторы, которые не используют wraps, положим, покачто). Но __doc__ установлен далеко не в каждой функции. А __name__ далеко не всегда уникально.
Есть что-нибудь?