将装饰器应用于导入的函数?

时间:2014-09-14 01:46:55

标签: python function decorator python-decorators

我想导入一个函数:

from random import randint

然后将装饰器应用于它:

@decorator
randint

我想知道是否有一些语法糖(就像我上面所说的那样),或者我必须这样做:

@decorator
def randintWrapper(*args):
    return random.randint(*args)

1 个答案:

答案 0 :(得分:34)

装饰器只是用装饰版本替换函数对象的语法糖,其中装饰只是调用(传入原始函数对象)。换句话说,语法:

@decorator_expression
def function_name():
    # function body

粗略地(*)转换为:

def function_name():
    # function body
function_name = decorator_expression(function_name)

在您的情况下,您可以手动应用装饰器:

from random import randint

randint = decorator(randint)

(*)在函数或类上使用@<decorator>时,defclass定义的结果未绑定(分配给它们的名称)在当前命名空间中)首先。装饰器直接从堆栈传递对象,然后只绑定装饰器调用的结果。