2013-05-06 1 views
0

Я начинаю с моего первого вишневого приложения. Я использую пример из документации http://docs.cherrypy.org/dev/progguide/REST.htmlSyntaxError: неожиданный символ после символа продолжения строки с использованием .format ( * * vars())

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

ответ

3

Удалить обратный слэш. Правильный синтаксис для ключевых слов расширений параметров является двойной звездочками:

html_item = lambda nv: '<div>{nv[0]}:{nv[1]}</div>'.format(**vars()) 

Это выглядит как ошибка в оказании документации CherryPy.

The \ обратной косой черты (за пределами строковых литералов) используется для сигнализации линии продолжения и допускается только в конце строки сказать 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' 

 Смежные вопросы

  • Нет связанных вопросов^_^