7

これが私の例です:

from flask import Flask

app = Flask(__name__)
def add1(f):
    def inner(*args, **kwargs):
        return str(f(*args, **kwargs))+'1'
    return inner


@app.route('/')
@add1
def hello1():
    return "hello1";

@app.route('/hello2')
@add1
def hello2():
    return "hello2";


if(__name__ =='__main__'):
    app.run()

127.0.0.1:5000 を実行すると、"hello11​​" が表示されるはずなのに、"hello21" が表示されるのはなぜですか?

4

1 に答える 1

15

問題は、Flask が名前で関数を追跡し、渡される関数app.route(path)が両方とも呼び出されるinnerため、2 番目の関数 ( hello2) が最初の関数を上書きすることです。これを修正するには、inner関数の名前を装飾している関数の名前に変更する必要があります。デコレータを次のように変更できます

def add1(f):
    def inner(*args, **kwargs):
        return str(f(*args, **kwargs))+'1'
    inner.__name__ = f.__name__
    return inner

これは機能しますが、標準ライブラリ ソリューションほどエレガントではありません。

from functools import wraps

def add1(f):
    @wraps(f)
    def inner(*args, **kwargs):
        return str(f(*args, **kwargs))+'1'
    return inner

デコレーターは名前wrapsだけでなく、docstring、ファイル、および属性辞書も修正します。

于 2012-07-16T04:48:18.237 に答える