Decorators are just syntactic sugar to replace a function object with a decorated version, where decorating is just calling (passing in the original function object). In other words, the syntax:
@decorator_expression
def function_name():
# function body
roughly(*) translates to:
def function_name():
# function body
function_name = decorator_expression(function_name)
In your case, you can apply your decorator manually instead:
from random import randint
randint = decorator(randint)
(*) When using @<decorator>
on a function or class, the result of the def
or class
definition is not bound (assigned to their name in the current namespace) first. The decorator is passed the object directly from the stack, and only the result of the decorator call is then bound.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…