Ответ 1
Он просто очищает локальную ссылку до self
, убедившись, что если возникает исключение, ссылка, переданная в self._loop.call_exception_handler()
, является единственной оставшейся ссылкой, и цикл не был создан.
Это все еще необходимо здесь, потому что на локальное пространство имен ссылается на трассировку исключения; он будет не очищаться, когда функция завершается, так как есть ссылка на живые живые.
Это описано в sys.exc_info()
документации по функциям с предупреждением:
Предупреждение. Присвоение возвращаемому значению traceback локальной переменной в функции, обрабатывающей исключение, вызовет циклическую ссылку. Это предотвратит что-либо, на которое ссылается локальная переменная в той же функции, или трассировка от сбора мусора. Поскольку большинство функций не требуют доступа к трассировке, лучшим решением является использование чего-то типа
exctype, value = sys.exc_info()[:2]
для извлечения только типа и значения исключения. Если вам нужна трассировка, обязательно удалите ее после использования (лучше всего сделать с инструкциейtry ... finally
) или вызовитеexc_info()
в функции, которая сама не обрабатывает исключение.
Поскольку обработчики tulip
образуют основной класс фреймворка, код обрабатывает круглый ссылочный случай трассировки, удаляя self
из локального пространства имен, так как он не может гарантировать, что функции _callback
или call_exception_handler
очистят их ссылки.
В CPython объекты уничтожаются, когда их счетчик ссылок падает до 0, но циклическая ссылка (серия объектов, ссылающихся на себя в цикле) никогда не увидит, что их количество отсчетов ссылок равно 0. Сборщик мусора пытается разбить такие но он не всегда может сделать это или не достаточно быстро. Явная очистка ссылок позволяет избежать циклов.
Например, если существует метод __del__
, сборщик мусора не будет прерывать цикл, поскольку он не будет знать, в каком порядке безопасно сломать цикл в этом случае.
Даже если не существует метода __del__
(который класс каркаса никогда не должен принимать, это не так), лучше не полагаться на сборщик мусора в конечном итоге на очистку циклов.