为什么装饰器不能与内置函数一起使用?
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!
<>=========================<>
我正在学习如何在 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!
<>=========================<>