The args member variable is set by BaseException.__new__ and used by BaseException.__reduce__ for pickling. To avoid interfering with it, we need to avoid calling BaseException.__init__ from classes that have subclasses with incompatible constructors, and rename our own tornado.web.HTTPError.args member.
>>> pickle.loads(pickle.dumps(tornado.simple_httpclient.HTTPTimeoutError("message")))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: HTTPTimeoutError.__init__() takes 2 positional arguments but 4 were given
>>> str(pickle.loads(pickle.dumps(tornado.web.HTTPError(500, "%s", "foo"))))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/anders/python/tornado/tornado/web.py", line 2488, in __str__
return message + " (" + (self.log_message % self.args) + ")"
~~~~~~~~~~~~~~~~~^~~~~~~~~~~
TypeError: not enough arguments for format string
The
args
member variable is set byBaseException.__new__
and used byBaseException.__reduce__
for pickling. To avoid interfering with it, we need to avoid callingBaseException.__init__
from classes that have subclasses with incompatible constructors, and rename our owntornado.web.HTTPError.args
member.