编写python闭包的更好方法是什么?

-6 python closures

我的问题可以通过简单的是或否回答:

  • 是的,italic's"封闭样式"是编写python闭包的更好方法 - 换句话说 - italic's"封闭符号"不会破坏并且没有任何警告

  • 不,italic关闭是有问题的,bold"封闭符号"是唯一的方法

为了以防万一,如果有人想知道"这件事是什么",那么为什么"他"不使用标准封口 - 标准形式,它让我想要逃跑.

def example():

    # The standard X_x closure...
    #
    def bold(predecessor):
        def successor():
            return "<bold/>" + predecessor() + "</bold>"
        return successor

    # ...this looks sooo much better ^.^
    #
    def italic(predecessor):
        x = predecessor
        def successor():
            return "<italic/>" + x() + "</italic>"
        return successor

    def underline(predecessor):
        x = predecessor
        def successor():
            return "<underline/>" + x() + "</underline>"
        return successor

    @italic
    @bold
    @underline
    def trademark():
        return "This trademark cant be changed."

    print(trademark())
    #example() prints <italic/><bold/><underline/>This trademark cant be changed.</underline></bold</italic>
Run Code Online (Sandbox Code Playgroud)

Eri*_*ric 8

当然,你可以这样做:

def italic(predecessor):
    x = predecessor
    def successor():
        return "<italic/>" + x() + "</italic>"
    return successor
Run Code Online (Sandbox Code Playgroud)

就像你能做的那样:

def italic(predecessor):
    x = predecessor
    x2 = x
    def successor():
        return "<italic/>" + x2() + "</italic>"
    return successor
Run Code Online (Sandbox Code Playgroud)

要么

def italic(predecessor):
    x = predecessor
    x2 = x
    x3 = x2
    def successor():
        return "<italic/>" + x3() + "</italic>"
    return successor
Run Code Online (Sandbox Code Playgroud)

但你为什么要这样做?


编写装饰器的最佳方法是functools.wraps:

from functools import wraps

def italic(f):
    @wraps(f)
    def decorated():
        return "<italic/>" + f() + "</italic>"
    return decorated
Run Code Online (Sandbox Code Playgroud)

但如果你真的想要与众不同:

import functools

def italic(f):
    return functools.update_wrapper(lambda: "<italic/>" + f() + "</italic>", f)
Run Code Online (Sandbox Code Playgroud)

  • @StevenRumbalski什么?不是.现在,通过非常大或无限数量的连接来累积字符串会产生性能问题,应该避免,但是`+`是**连接字符串的惯用方法. (2认同)
  • 可以说,这可以通过使用`str.format()`来减少麻烦,但是,是的,加上像这样的几个字符串的`+`是合法的. (2认同)
  • @StevenRumbalski:所以使用`+`构建字符串并不是真正的反模式(我认为这与Lattyware解释不相关),但使用字符串构建HTML是一个坏主意(我同意)? (2认同)