开发者社区> 问答> 正文

Python 的装饰器执行顺序问题?报错

我用 flask 框架做一个网站的过程中,要用到装饰器,缩减版代码如下:

def testwra(func):
    print "testwra"
    def _wrapper():
        print "wra"
        r = func()
        return r
    print "end"
    return _wrapper

@testwra
@app.route('/users', methods=['GET'])
def get_users():
    return ['33', '44']

这里,正常的执行顺序不应该是 testwra->先后打印 testwra 和 end->调用_wrapper->打印 wra->调用 func()函数->返回 list->返回 r,但是我这里在浏览器中输入 url ( http://localhost:5000/users ),却不会打印 wra,好像是没有进入_wrapper 函数中。

而且还会报错 TypeError: 'list' object is not callable
list 不是可以作为返回值的吗?

展开
收起
爱吃鱼的程序员 2020-06-06 15:07:24 591 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
                        你看看app.route返回什么? 
                    
    
                        <p>你应该用functools.wraps装饰一下你的testwra,并把@testwra和@app.ruote顺序调整一下:</p> 
    
    import functools
    
    def testwra(func):
        print "testwra"
        @functools.wraps(func)
        def _wrapper():
            print "wra"
            r = func()
            return r
        print "end"
        return _wrapper
    
    @app.route('/users', methods=['GET'])
    @testwra
    def get_users():
        return ['33', '44']

     

                            感谢,确实是装饰器调用顺序的问题,调整后就正常了~
    
    2020-06-06 15:07:38
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载