将装饰程序转换为其实现代码

2024-10-04 01:34:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习装饰,发现了这个有用的线索,真的帮了我很多。 How to make a chain of function decorators?

根据我的理解,装饰者只是语法上的糖。但是,我在从语法糖代码转换为非语法糖代码时遇到了困难

# Decorators
def addBold(func):
    def wrapper(*arg1):
        print("Bold Added")
        return '<b>' + func(*arg1) + '</b>'
    return wrapper

def addItalic(func):
    def wrapper(*arg1):
        print("Italic Added")
        return '<i>' + func(*arg1) + '</i>'
    return wrapper

此代码适用于:

@addBold
def getHTMLCode(passedText):
    return passedText

newVar = getHTMLCode('Hello')
print(newVar)
# outputs: Bold Added <b>Hello</b>

我尝试转换为非语法的糖类代码,但这不起作用(TypeError: 'str' object is not callable):

def getHTMLCode(passedText):
    return passedText

newVar = addBold(getHTMLCode('Hello'))  # returns wrapper
newVar()

在没有装饰语法糖的情况下,工作代码(第二个块)是什么样子的


Tags: 代码helloaddedreturndef语法装饰wrapper
1条回答
网友
1楼 · 发布于 2024-10-04 01:34:10

您需要将要包装的函数传递给decorator函数,然后使用以下参数调用返回的包装器:

wrapped_getHTMLCode = addBold(getHTMLCode)
wrapped_getHTMLCode('Hello')

请注意wrapped_getHTMLCode的工作原理与getHTMLCode的装饰版本类似。您使用希望加粗的字符串调用它,它返回的字符串周围带有HTML加粗标记

相关问题 更多 >