From fe22e0985adae5ccfe230c815267fd410de59148 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 4 Dec 2014 23:00:13 +0100 Subject: [PATCH] asyncio: Initialize more Future and Task attributes in the class definition to avoid attribute errors in destructors. --- Lib/asyncio/futures.py | 3 +-- Lib/asyncio/tasks.py | 7 ++++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py index 19e79189dc2..f46d008f08a 100644 --- a/Lib/asyncio/futures.py +++ b/Lib/asyncio/futures.py @@ -135,6 +135,7 @@ class Future: _result = None _exception = None _loop = None + _source_traceback = None _blocking = False # proper use of future (yield vs yield from) @@ -155,8 +156,6 @@ class Future: self._callbacks = [] if self._loop.get_debug(): self._source_traceback = traceback.extract_stack(sys._getframe(1)) - else: - self._source_traceback = None def _format_callbacks(self): cb = self._callbacks diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index a2128c5545d..9aebffdaba3 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -41,6 +41,10 @@ class Task(futures.Future): # all running event loops. {EventLoop: Task} _current_tasks = {} + # If False, don't log a message if the task is destroyed whereas its + # status is still pending + _log_destroy_pending = True + @classmethod def current_task(cls, loop=None): """Return the currently running task in an event loop or None. @@ -73,9 +77,6 @@ class Task(futures.Future): self._must_cancel = False self._loop.call_soon(self._step) self.__class__._all_tasks.add(self) - # If False, don't log a message if the task is destroyed whereas its - # status is still pending - self._log_destroy_pending = True # On Python 3.3 or older, objects with a destructor that are part of a # reference cycle are never destroyed. That's not the case any more on