Python 尝试运行tornado main.py时出现语法错误
这是我的简单tornado项目main.py文件:Python 尝试运行tornado main.py时出现语法错误,python,tornado,Python,Tornado,这是我的简单tornado项目main.py文件: import os import os.path import tornado.ioloop import tornado.web import tornado.httpserver import tornado.options from tornado.options import options class Index(tornado.web.RequestHandler): def get(self, *args, **kw
import os
import os.path
import tornado.ioloop
import tornado.web
import tornado.httpserver
import tornado.options
from tornado.options import options
class Index(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
self.write('Hello')
url_patterns = {
(r'/', Index),
}
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(
url_patterns,debug=True,
cookie_secret="*****",
xsrf_cookies= False,
template_path=os.path.join(os.path.dirname(__file__), "templates"),
static_path= os.path.join(os.path.dirname(__file__), "static"),
)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(8080)
tornado.ioloop.IOLoop.instance().start()
当我要运行此文件时,错误显示:
File "main.py", line 16
(r'/', Index),
^
SyntaxError: invalid syntax
我想在centos 6和python 2.7.8上运行它。这是我的错误图片:
我的项目出了什么问题?您使用的大括号
{}
表示您试图定义字典或集合。我假设url\u patterns
,就像它在Django中的对应物一样,是一个元组,因此您需要使用括号()
:
url_patterns = (
(r'/', Index),
)
我猜您使用的是python2.6,因为对于python2.7来说,所有的语法似乎都是有效的。在python2.7上
url_patterns = {
(r'/', Index),
}
将尝试用一个2元组的单个成员构造一个集合。但是,如果索引
不可散列,它将失败并出现类型错误
。但是,Set文本直到python2.7才存在,因此对于早期的python版本,您的代码将抛出一个SyntaxError
一般来说,根据我的经验(使用webapp2
),处理程序的顺序很重要——因此最好使用有序的iterable,而不是集。可能是元组
或列表
。e、 g:
url_patterns = [
(r'/', Index),
]
显然,如果tornado.web.Application
需要其中一个,请使用它;-)(,所以这可能是安全的…)但是——这真的能解释语法错误吗?似乎{(r'/','whatever')}
是有效的语法(至少在python2.7中是这样。它是一个集,元组是唯一的成员——当然,在运行时,如果索引
不可散列,它将引发类型错误
,但在尝试运行它之前,它不知道这一点…@mgilson它在python2.6上给出了一个语法错误(我在前面假设),至少在我的Mac上,我没有看到语法问题(虽然已经晚了…)。您使用的是什么版本的python?@mgilson很可能是python 2.6或更早:{}
set的语法只被后传到Python 2.7中。@AshwiniChaudhary——是的,这是我在找不到语法问题时所假设的。快速的谷歌搜索显示set文本出现在python2.7中——但我感觉我已经使用它们很长时间了……请注意,set的repr
输出是直到Python 2.7中的旧版本:是的,url_模式应该是一个列表。任何iterable都可以,但顺序很重要,所以冻结集不是一个好主意(非冻结集通常不起作用,因为处理程序类不可散列)。