私はトルネードのRequestHandlerのヘルパーデコレータを書いた:「RecursionError:比較に超えた最大再帰の深さ」非同期機能の
def return_response(method):
@wraps(method)
async def wrapper(self, *args, **kwargs):
response = method(self, *args, **kwargs)
if inspect.isawaitable(response):
response = await response
self.set_status(response.status)
self.write(response.body)
return wrapper
それが次のエラーで失敗するいくつかの理由:
Traceback (most recent call last):
File ".../.venv/lib/python3.6/site-packages/tornado/web.py", line 1511, in _execute
result = yield result
File ".../.venv/lib/python3.6/site-packages/tornado/gen.py", line 1055, in run
value = future.result()
File ".../.venv/lib/python3.6/site-packages/tornado/concurrent.py", line 238, in result
raise_exc_info(self._exc_info)
File "<string>", line 4, in raise_exc_info
File ".../.venv/lib/python3.6/site-packages/tornado/gen.py", line 307, in wrapper
yielded = next(result)
File "<string>", line 6, in _wrap_awaitable
File ".../src/http_handlers/decorators.py", line 106, in wrapper
response = await response
File ".../src/http_handlers/decorators.py", line 106, in wrapper
response = await response
File ".../src/http_handlers/decorators.py", line 106, in wrapper
response = await response
[Previous line repeated 959 more times]
File ".../src/http_handlers/decorators.py", line 104, in wrapper
response = method(self, *args, **kwargs)
RecursionError: maximum recursion depth exceeded in comparison
このエラーは、アプリケーションがしばらくアップしているときにのみ表示されます。 Python、Tornadoのバグですか、私のコードが間違っていますか?誰かが同じ問題に遭遇しましたか?
更新
私はこの問題を解決するために管理してきました。まったく別の場所にあった。私はこのデコレータを実行時に__new__
メソッドに適用しました。誤って実際のインスタンスではなくcls
のメソッドに適用していました。したがって、クラスの新しいインスタンスが作成されるたびに、メソッドが再びラップされていました。
「応答待ち」の内部では、「return_response」で装飾された別の関数が何度も繰り返されることがあります。 – Sraw
なぜ私は何度も何度もそれを待っていますか?私が正しく理解していれば、ラッパーは 'response = await response'で呼び出され、中止され、この行の直後に再開されます。 'if'文は2回チェックされません。 – mcferden
すみません、最初のコメントはちょっと混乱していますが、私はそれを削除します。 – Sraw