Применяя предполагаемый декоратор, перехватывая исключения и затем проверяя, содержит ли результат метод __call__
, вы могли бы сделать предположение относительно того, является ли данный вызываемый объект декоратором или нет. Но это будет только предположение, а не гарантия.
Кроме того, я не верю, что то, что вы хотите, будет вообще возможным из-за динамически типизированной природы языка Python и особой обработки встроенных функций в интерпретаторе CPython. Невозможно программно определить, будет ли вызываемый объект принимать другой вызываемый в качестве аргумента или какой тип будет иметь его возвращаемое значение. Кроме того, в CPython для функций, реализованных в C, вы даже не можете проверить вызываемый объект, чтобы увидеть, сколько аргументов он принимает.
Слово «декоратор» может означать разные вещи. Один из способов определить это - декоратор - это любой вызываемый объект, который принимает один (вызываемый) аргумент и возвращает вызываемый элемент.
Обратите внимание, что я даже не использовал слово "функция" в этом определении; это было бы на самом деле неправильно. Действительно, некоторые часто используемые декораторы имеют странные свойства:
- Встроенные декораторы
classmethod
и staticmethod
возвращают дескрипторные объекты, а не функции.
- Начиная с языковой версии 2.6 вы можете украшать классы, а не только функции и методы.
- Любой класс, содержащий метод
__init__(self, somecallable)
и метод __call__(self, *args, **kwargs)
, может использоваться в качестве декоратора.