有人能解释一下这个Python代码吗?(可能使用装饰器)

2024-06-16 11:56:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Python编写一个简单(轻量级)RESTful服务器。我遇到了来自Google的以下代码:

import web
import json
from mimerender import mimerender

render_xml = lambda message: '<message>%s</message>'%message
render_json = lambda **args: json.dumps(args)
render_html = lambda message: '<html><body>%s</body></html>'%message
render_txt = lambda message: message

urls = (
    '/(.*)', 'greet'
)
app = web.application(urls, globals())

class greet:
    @mimerender(
        default = 'html',
        html = render_html,
        xml  = render_xml,
        json = render_json,
        txt  = render_txt
    )
    def GET(self, name):
        if not name: 
            name = 'world'
        return {'message': 'Hello, ' + name + '!'}

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

我不熟悉@mimerender行中使用的语法。但是,我通常会遇到这样一个decorator和-date-decorator的组合:

^{pr2}$

代码的@mimerender部分是什么意思/do?在


Tags: lambda代码nameimporttxtwebjsonmessage
3条回答

这里发生的是mimerender是一个要获得的装饰器:

@mimerender
def GET(self, name):

但是还有一些参数需要传递给mimerender,所以它们就在那里完成了。在

mimerender的docstring中,如果需要额外的阅读:

^{pr2}$

当被调用时,mimerender将使用提供的参数构造并返回一个装饰函数。然后使用返回的decorator函数装饰GET方法。在

@expr
def foo(args):
    pass

相当于

^{pr2}$

expr可以是任何有效的python表达式,因此mimerender(…)返回一个可调用对象(可以是构造函数,也可以是返回可调用对象的函数)。这里没什么魔力:)

因此,上述呼吁是公正的

def GET(self, name):
    if not name: 
        name = 'world'
    return {'message': 'Hello, ' + name + '!'}
GET = mimerender(…)(GET)

相关问题 更多 >