Lento con forza

大学生気分のIT系エンジニアが色々書いてく何か。ブログ名決めました。

概説Tornadoを読んでます。

電子書籍反対派の僕でしたが、電子書籍しかない本に出会ってしかたなく電子書籍買いました。

ってことで概説Tornadoを読んでます。

UIモジュールの章を読んでて、コピペで試したらうまく行きませんでした。

Kouki-2:books kouki$ python hello_module.py 
Traceback (most recent call last):
  File "hello_module.py", line 23, in <module>
    ui_modules={'Hello', HelloModule}
  File "/Library/Python/2.7/site-packages/tornado/web.py", line 1512, in __init__
    self._load_ui_modules(settings.get("ui_modules", {}))
  File "/Library/Python/2.7/site-packages/tornado/web.py", line 1629, in _load_ui_modules
    assert isinstance(modules, dict)
AssertionError

こんな感じでAssertionError

なんでかなー、って思ってエラー確認するとui_modulesの指定でおかしくなってるらしい。
本出た時のバージョンと今のバージョンではui_modulesの指定方法違うのかな?って思ってui_moduleについて調べました。
すると、ここでは、本と違う呼び出し方をしてました。だけどこれって本質的な違いじゃないよなー。って思いつつもう一度ソースコードを見直すと

if __name__  == '__main__':
    tornado.options.parse_command_line()
    app = tornado.web.Application(
        handlers=[(r'/', HelloHandler)],
        template_path=os.path.join(os.path.dirname(__file__), 'templates'),
        ui_modules={'Hello', HelloModule} #ここでエラーが起きてる
    )
    server = tornado.httpserver.HTTPServer(app)
    server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

注目すべきはここです。

ui_modules={'Hello', HelloModule} 

辞書渡すのが正しい構文ですが、ここでは区切り記号を","にしてしまっているため、set*1になってしまってます。
本来ならdictを渡したいので、","を":"に変えてあげて

if __name__  == '__main__':
    tornado.options.parse_command_line()
    app = tornado.web.Application(
        handlers=[(r'/', HelloHandler)],
        template_path=os.path.join(os.path.dirname(__file__), 'templates'),
        ui_modules={'Hello' : HelloModule} #dictを渡すように変更
    )
    server = tornado.httpserver.HTTPServer(app)
    server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

こう1文字書き換えるだけで動くコードの出来上がりです。

*1:Pythonでは波括弧でカンマ区切りを使うと集合型になる