Нет, импорт декорированной функции не удалит декоратор.
При импорте извлекается текущий объект из глобального пространства имен исходного модуля, а декорирование функции вызывает возвращаемое значение декораторадля хранения в глобальном пространстве имен.
Импорт модуля - это в основном синтаксический сахар для modulename = sys.modules['modulename']
(для import modulename
) и objectname = sys.modules['modulename'].objectname
назначений (для from modulename import objectname
, либо вcase после первого, гарантирующего, что sys.modules
загрузил нужный модуль), и глобальные переменные в модуле - это то же самое, что и атрибуты объекта модуля.Декорирование - просто синтаксический сахар для functionname = decorator(functionobject)
.
Если вам нужно добавить новый декоратор к импортированной функции, просто вызовите декоратор:
from somemodule import somedecoratedfunction
newname_or_originalname = decorator(somedecoratedfunction)
Если импортированная декорированная функция не 'Можно снова декорироваться в новом слое, или вы хотите получить доступ к исходной неокрашенной функции, посмотрите, имеет ли объект атрибут __wrapped__
:
from somemodule import somedecoratedfunction
unwrapped_function = somedecoratedfunction.__wrapped__
Хорошо написанные декораторы используют @functools.wraps()
decorator , который устанавливает этот атрибут так, чтобы он указывал на оригинал:
>>> from functools import wraps
>>> def demodecorator(f):
... @wraps(f)
... def wrapper(*args, **kwargs):
... print("Decorated!")
... return f(*args, **kwargs)
... return wrapper
...
>>> @demodecorator
... def foo(name):
... print(f"Hello, {name or 'World'}!")
...
>>> foo('cardamom')
Decorated!
Hello, cardamom!
>>> foo.__wrapped__('cardamom')
Hello, cardamom!