我开始使用我的第一个樱桃应用程序。我使用的是文档http://docs.cherrypy.org/dev/progguide/REST.html
中的示例import cherrypy
class Resource(object):
def __init__(self, content):
self.content = content
exposed = True
def GET(self):
return self.to_html()
def PUT(self):
self.content = self.from_html(cherrypy.request.body.read())
def to_html(self):
html_item = lambda (name,value): '<div>{name}:{value}</div>'.format(\*\*vars())
items = map(html_item, self.content.items())
items = ''.join(items)
return '<html>{items}</html>'.format(**vars())
@staticmethod
def from_html(data):
pattern = re.compile(r'\<div\>(?P<name>.*?)\:(?P<value>.*?)\</div\>')
items = [match.groups() for match in pattern.finditer(data)]
return dict(items)
class ResourceIndex(Resource):
def to_html(self):
html_item = lambda (name,value): '<div><a href="{value}">{name}</a></div>'.format(\*\*vars())
items = map(html_item, self.content.items())
items = ''.join(items)
return '<html>{items}</html>'.format(**vars())
class Root(object):
pass
root = Root()
root.sidewinder = Resource({'color': 'red', 'weight': 176, 'type': 'stable'})
root.teebird = Resource({'color': 'green', 'weight': 173, 'type': 'overstable'})
root.blowfly = Resource({'color': 'purple', 'weight': 169, 'type': 'putter'})
root.resource_index = ResourceIndex({'sidewinder': 'sidewinder', 'teebird': 'teebird', 'blowfly': 'blowfly'})
conf = {
'global': {
'server.socket_host': '0.0.0.0',
'server.socket_port': 8000,
},
'/': {
'request.dispatch': cherrypy.dispatch.MethodDispatcher(),
}
}
cherrypy.quickstart(root, '/', conf)
我在以下行中使用lambda
方法出错:
html_item = lambda (name,value): '<div>{name}:{value}</div>'.format(\*\*vars())
并在阅读Python 3.2 Lambda Syntax Error
后将其更改为以下内容html_item = lambda nv: '<div>{nv[0]}:{nv[1]}</div>'.format(\*\*vars())
但现在我收到“SyntaxError:连续字符后的意外字符”链接到上一行.format(\*\*vars())
的末尾。
是什么造成的?
我正在运行Python 3.2和CherryPy 3.2.2
答案 0 :(得分:3)
删除反斜杠。关键字参数扩展的正确语法是双星号:
html_item = lambda nv: '<div>{nv[0]}:{nv[1]}</div>'.format(**vars())
这看起来像是CherryPy文档渲染中的一个错误。
\
反斜杠(字符串文字外部)用于表示行继续,并且只允许在行的 end 中告诉Python忽略换行符:
somevar = some_function_call(arg1, arg2) + \
some_other_function_call(arg3, arg4)
不建议使用语法(您应该使用括号),但这是Python期望在这里看到的而不是星号。
显示异常的快速演示确实是由反斜杠引起的:
>>> test = dict(foo='bar')
>>> '{foo}'.format(\*\*test)
File "<stdin>", line 1
'{foo}'.format(\*\*test)
^
SyntaxError: unexpected character after line continuation character
>>> '{foo}'.format(**test)
'bar'