Python装饰器的预期寿命是多久?

3
我的问题围绕实现Python装饰器的预期寿命。根据realpython.org,它说:

"按照定义,装饰器是一个接受另一个函数并扩展后者行为的函数,而不明确修改后者。"

在我看来,装饰器经常用于在线示例中临时修改或扩展Python函数,例如HTML格式化示例。 例如
假设我在一家网站开发公司工作,在所有网页的顶部调用此Python函数page_welcome()
def page_welcome():
    return "Welcome to XYZ's company webpage!"

现在,一些开发人员加入公司并决定通过使用粗体斜体来修改函数,使其更加突出。

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 page_welcome():
    return "Welcome to XYZ's company webpage!"

如果我们决定这个改变是永久的,那么装饰器是保留这个永久修改的最好方式吗?
注意:上面的例子是来自这个链接的装饰器示例(稍作修改):如何在Python中创建函数装饰器链?

1
你为什么认为它们是暂时的?你看到有任何它们被某种方式移除的例子吗?你可以把加粗和斜体放在函数中,但这样就有多个关注点和有限的重用性。 - jonrsharpe
2
装饰器不是临时的。通常您会定义一个装饰器并将其应用于许多函数,因此它们是使代码更加DRY(即减少重复)的一种方式。例如,在像Django这样的框架中,您有一个名为login_require的装饰器,可以将其附加到表示仅可由已登录用户查看的网页的函数上,装饰器使未登录的人首先被重定向到登录页面。如果不使用装饰器,则必须在所有这些函数的开头放置几行代码来手动检查用户并将其重定向... - Bakuriu
3
我不理解你的目的。如果你决定永久更改该字符串,为什么不直接将其硬编码到你的字符串中呢? - Kir Chou
@所有人,我没有看到它们被删除的任何示例,但这只是一些示例给我的感觉。我想在第一眼看上去,虽然语法糖有助于DRY哲学,但它对我来说似乎很脆弱。也就是说,行为的添加和删除同样容易,对于未经培训的人来说,这似乎很容易发生意外。 - Scott Skiles
1个回答

3

装饰器的主要目的不是为了临时修改函数行为。在这里,“临时”一词有些奇怪。最好将它们视为职责分解和代码重用。它们主要用于添加某些行为,这些行为不是唯一绑定于装饰函数的,并且可以用于其他函数。一个很好的例子是 @memoized 装饰器,它记住装饰函数计算出的值(可能需要很长时间才能计算),并在下一次立即返回该值。这样的装饰器可以被多次重用,并且除此之外,它使核心更易读:您只需添加一行代码就可以清楚地说明实际发生的情况,而不是让您的函数膨胀到备忘录代码。


回头来看,自从我发布这篇文章以来学到了很多东西,编辑答案并加上一条注释说明装饰器本身就是一个设计模式,不仅限于Python,这将是有益的。 - Scott Skiles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接