ニシキヘビってかわいいよね、実際みたことないけど。

無職がいよかん国でプログラミングとかの備忘録を書いてます。 一日一食たまごかけごはん。

TornadoのApplicationRouterで例外が出たら

tornado.testingでの単体テスト中、ドツボにハマったのでメモ。

Failure
Traceback (most recent call last):
  """前略"""   line 62, in create_app
    app = Application(handlers, debug=debug)
  File "/home/nyanmao/python35_vir_env/lib/python3.5/site-packages/tornado/web.py", line 1910, in __init__
    self.wildcard_router = _ApplicationRouter(self, handlers)
  File "/home/nyanmao/python35_vir_env/lib/python3.5/site-packages/tornado/web.py", line 1785, in __init__
    super(_ApplicationRouter, self).__init__(rules)
  File "/home/nyanmao/python35_vir_env/lib/python3.5/site-packages/tornado/routing.py", line 363, in __init__
    super(ReversibleRuleRouter, self).__init__(rules)
  File "/home/nyanmao/python35_vir_env/lib/python3.5/site-packages/tornado/routing.py", line 288, in __init__
    self.add_rules(rules)
  File "/home/nyanmao/python35_vir_env/lib/python3.5/site-packages/tornado/routing.py", line 298, in add_rules
    assert len(rule) in (2, 3, 4)
AssertionError

_ApplicationRouterコンストラクタ呼び出しがトレースバック途中にあり、assert len(rule) in (2, 3, 4)の例外によって動作が止まったら、 Applicationコンストラクタに渡している引数handlerが正しいか確認する。

自分は、ルーティング先の次にRequestHandlerを継承したクラスを格納することを忘れていた。

from tornado.web import Application, RequestHandler

class MyRequestHandler(RequestHandler):

# 中略

app = Application([
    (
        r'/api/v0/spam', 
        MyRequestHandler,  # これ
    )
])

なぜドツボにはまったのかというと、ResourceWarning:でFileやsocketが閉じられてない、ないしは使い尽くしているともでるので、そっちの線をずっと探っていたから。 ああ、情けない。