===============
:py:mod:`wrapt`
===============
- `Documentation `_
- `How you implemented your Python decorator is wrong `_
(`GitHub `_)
- Special attributes of :py:class:`wrapt.FunctionWrapper` and derived types:
- ``__wrapped__``
- ``_self_instance``
- ``_self_wrapper``
- ``_self_enabled``
- ``_self_binding``
- ``_self_parent``
- Identify what kind of object is being decorated (necessary for "universal" decorators)::
import inspect
@wrapt.decorator
def universal(wrapped, instance, args, kwargs):
if instance is None:
if inspect.isclass(wrapped):
# Decorator was applied to a class.
return wrapped(*args, **kwargs)
else:
# Decorator was applied to a function or staticmethod.
return wrapped(*args, **kwargs)
else:
if inspect.isclass(instance):
# Decorator was applied to a classmethod.
return wrapped(*args, **kwargs)
else:
# Decorator was applied to an instancemethod.
return wrapped(*args, **kwargs)