Python 尝试运行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

这是我的简单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, **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都可以,但顺序很重要,所以冻结集不是一个好主意(非冻结集通常不起作用,因为处理程序类不可散列)。