4

这是错误:

TypeError: __init__() takes exactly 1 argument (3 given)
ERROR:root:Exception in callback <tornado.stack_context._StackContextWrapper object at 0x1017d4470>
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/tornado-2.4.1-py2.7.egg/tornado/ioloop.py", line  421, in _run_callback
    callback()
  File "/Library/Python/2.7/site-packages/tornado-2.4.1-py2.7.egg/tornado/iostream.py", line 311, in wrapper
    callback(*args)
  File "/Library/Python/2.7/site-packages/tornado-2.4.1-py2.7.egg/tornado/httpserver.py", line 268, in _on_headers
    self.request_callback(self._request)
  File "/Library/Python/2.7/site-packages/tornado-2.4.1-py2.7.egg/tornado/web.py", line 1395, in __call__
    handler = spec.handler_class(self, request, **spec.kwargs)
TypeError: __init__() takes exactly 1 argument (3 given)

这是代码:

class IndexHandler(tornado.web.RequestHandler):
    def __init__(self):
        self.title = "Welcome!"

    def get(self):
        self.render("index.html", title=self.title)

我已将代码简化为上述代码,但我对为什么会产生该错误感到困惑。我一定是做错了什么,但我不知道是什么(通过了 3 个参数???...嗯?)

注意:title变量只是<title>{{ title }}</title>我的 index.html 模板中的变量。

我正在运行 32 位版本的 Python 2.7.3,以便与 Mysqldb-Python 一起使用。如您所见,我的 Tornado 版本是 2.4.1。我也在 OSX Lion 上运行(如果这有什么不同的话......)也许是一个最终产生这个错误的兼容性问题?

调试此过程中的所有帮助表示赞赏。谢谢你。

4

2 回答 2

9

@Princess of the Universe 是对的,但也许这需要一些详细说明。

__init__Tornado 将使用RequestHandler参数调用子类application, request, **kwargs,因此您需要允许这样做。

你可以这样做:

def __init__(self, application, request, **kwargs):
    self.title = "Welcome!"
    super(IndexHandler, self).__init__(application, request, **kwargs)

这意味着您的IndexHandler类现在使用与父类相同的签名进行初始化。

但是,我更喜欢initializeTornado 为此目的提供的方法:

def initialize(self):
    self.title = "Welcome!"
于 2013-02-16T09:48:47.133 回答
1

你是压倒一切的

__init__()

以不恰当的方式。

http://www.tornadoweb.org/documentation/web.html

签名是

class tornado.web.RequestHandler(application, request, **kwargs)[source]

很明显,您必须为派生类的构造函数提供相同的 API。

于 2013-02-16T06:12:57.460 回答