gpt4 book ai didi

python - 为什么不能跨定义链接 Python 装饰器?

转载 作者:太空狗 更新时间:2023-10-29 20:55:05 25 4
gpt4 key购买 nike

为什么下面两个脚本不等价?

(摘自另一个问题:Understanding Python Decorators)

def makebold(fn):
def wrapped():
return "<b>" + fn() + "</b>"
return wrapped

def makeitalic(fn):
def wrapped():
return "<i>" + fn() + "</i>"
return wrapped

@makebold
@makeitalic
def hello():
return "hello world"

print hello() ## returns <b><i>hello world</i></b>

还有装饰器:

def makebold(fn):
def wrapped():
return "<b>" + fn() + "</b>"
return wrapped

@makebold
def makeitalic(fn):
def wrapped():
return "<i>" + fn() + "</i>"
return wrapped

@makeitalic
def hello():
return "hello world"

print hello() ## TypeError: wrapped() takes no arguments (1 given)

我为什么想知道?我写了一个 retry 装饰器来捕获 MySQLdb 异常 - 如果异常是暂时的(例如超时),它会在稍微休眠后重新调用该函数。

我还有一个 modifies_db 装饰器,它负责一些与缓存相关的内务处理。 modifies_dbretry 修饰,所以我假设所有用modifies_db 修饰的函数也会隐式重试。我哪里出错了?

最佳答案

第二个例子的问题在于

@makebold
def makeitalic(fn):
def wrapped():
return "<i>" + fn() + "</i>"
return wrapped

试图装饰makeitalic,装饰器,而不是wrapped,它返回的函数。

你可以用这样的东西做我认为你想要的:

def makeitalic(fn):
@makebold
def wrapped():
return "<i>" + fn() + "</i>"
return wrapped

这里makeitalic使用makebold装饰wrapped

关于python - 为什么不能跨定义链接 Python 装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2094008/

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