gpt4 book ai didi

python - 写在装饰器前后

转载 作者:行者123 更新时间:2023-11-28 20:23:52 24 4
gpt4 key购买 nike

我有以下示例代码,

def say_hello(f):
def wrap():
print "Hello"
return wrap

def say_bye(f):
def wrap():
print "Bye"
return wrap

@say_hello
@say_bye
def process():
return "Processing"

process()

输出:

Hello

我期望输出为:

Bye
Hello
Processing
  1. 可能出了什么问题?
  2. 如何使装饰器在函数调用之前和之后被调用?

意味着,对于上面的例子,我可以有输出吗:

    Hello
Processing
Bye

最佳答案

从装饰器返回的“包装”函数实际上并没有调用它们应该包装的函数。这是一个问题,因为装饰器返回的函数在调用包装函数之前没有被调用;它替换它包装的函数。以下装饰器语法:

@some_decorator
def func(arg):
function_body()

是以下代码的语法糖:

def func(arg):
function_body()
func = some_decorator(func)

因此,你想要的是

def say_hello(f):
def wrap(*args, **kwargs):
print "Hello"
return f(*args, **kwargs)
return wrap

def say_bye(f):
def wrap(*args, **kwargs):
return_value = f(*args, **kwargs)
print "Bye"
return return_value
return wrap

@say_hello
@say_bye
def process():
return "Processing"

这会产生

Hello
Processing
Bye

关于python - 写在装饰器前后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18650159/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com