Предположим, у вас есть оформление функции, подобное этому
def double_arg(fun):
def inner(x):
return fun(x*2)
return inner
, однако вы не можете получить к нему доступ (оно находится внутри сторонней библиотеки или чего-то еще).В этом случае вы можете обернуть его в другую функцию, которая добавляет имя украшения к результирующей функции
def keep_decoration(decoration):
def f(g):
h = decoration(g)
h.decorated_by = decoration.__name__
return h
return f
и заменяет старое украшение оболочкой.
double_arg = keep_decoration(double_arg)
Вы можетедаже написать вспомогательную функцию, которая проверяет, декорирована ли функция.
def is_decorated_by(f, decoration_name):
try:
return f.decorated_by == decoration_name
except AttributeError:
return False
Пример использования ...
@double_arg
def inc_v1(x):
return x + 1
def inc_v2(x):
return x + 1
print(inc_v1(5))
print(inc_v2(5))
print(is_decorated_by(inc_v1, 'double_arg'))
print(is_decorated_by(inc_v2, 'double_arg'))
Вывод
11
6
True
False