Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 烧瓶中的蟒蛇装饰器_Python_Decorator_Flask - Fatal编程技术网

Python 烧瓶中的蟒蛇装饰器

Python 烧瓶中的蟒蛇装饰器,python,decorator,flask,Python,Decorator,Flask,以下是我的例子: 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 d

以下是我的例子:

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”,为什么?

问题是Flask按名称跟踪函数,并且由于传递到
app.route(path)
的函数都被称为
内部
,第二个(
hello2
)会覆盖第一个。要解决此问题,您需要将
内部
函数的名称更改为它所修饰的函数的名称。你可以把装潢师改成

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

wrapps
decorator不仅修复了名称,还修复了docstring、文件和属性字典。

感谢官方
@wrapps
的具体好处示例!