-6

私の質問には、単純な「はい」または「いいえ」で答えることができます。

  • はい、italicの「クロージャ スタイル」は python クロージャを記述するためのより良い方法です。つまり、italicの「クロージャ表記」は壊れず、警告もありません。

  • いいえ、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>
4

1 に答える 1

8

もちろん、次のことができます。

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

あなたができるように:

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

また

def italic(predecessor):
    x = predecessor
    x2 = x
    x3 = x2
    def successor():
        return "<italic/>" + x3() + "</italic>"
    return successor

しかし、なぜあなたはしたいのですか?


デコレータを記述する最良の方法は、次のfunctools.wrapsとおりです。

from functools import wraps

def italic(f):
    @wraps(f)
    def decorated():
        return "<italic/>" + f() + "</italic>"
    return decorated

しかし、もしあなたが本当に違うことをしたいのなら:

import functools

def italic(f):
    return functools.update_wrapper(lambda: "<italic/>" + f() + "</italic>", f)
于 2013-05-28T21:36:48.163 に答える