为什么装饰器不能与内置函数一起使用?

Why do decorators not work with built in functions?

我正在学习如何在 Python 中使用装饰器,并且对此有深入的了解,但我有一个问题 - 为什么我不能对内置函数使用装饰器?

为什么这样做:

def decorator1(func):
    def inner(*args, **kwargs):
        print("<>=========================<>")
        func(*args, **kwargs)
        print("<>=========================<>")
    return inner

@decorator1
def greet():
    print("Hello!")


greet()

不是这个?:

def decorator1(func):
    def inner(*args, **kwargs):
        print("<>=========================<>")
        func(*args, **kwargs)
        print("<>=========================<>")
    return inner

@decorator1
print("Hello!")

难道打印函数是当场执行的,而greet()函数只定义了@decorator1之后才运行?

@decorator 的语法只能与 def ... function definition or class ... class definition 语句一起使用。这并不意味着您不能 'decorate' built-in 函数。

但是,您尝试将语法应用于 expression statement, one that calls print() 函数。您最多修饰 return 值(对于 print() 函数,它始终是 None)。

然而,装饰器只是 syntactic sugar。语法

@decorator_expression
def functionname(...): ...

执行为

def functionname(...): ...

functionname = decorator_expression(functionname)

但没有 functionname 被分配给两次。

所以要装饰 print,显式调用装饰器:

decorated_print = decorator1(print)
decorated_print("Hello!")

注意:我在这里明确地选择了一个不同的名称来分配装饰器函数的结果。如果您真的愿意,您 也可以 使用 print = decorator1(print)。但随后您可能想 运行 del print 稍后揭开 built-in 功能,或使用 builtins.print 再次访问原始功能。

演示:

>>> def decorator1(func):
...     def inner(*args, **kwargs):
...         print("<>=========================<>")
...         func(*args, **kwargs)
...         print("<>=========================<>")
...     return inner
...
>>> decorated_print = decorator1(print)
>>> decorated_print("Hello!")
<>=========================<>
Hello!
<>=========================<>