Оказывается, aiohttp
не только генерирует обычные предупреждения с этим текстом, но также вызывает обработчик исключение цикла с тем же сообщением во время неисключительного вызова __del__
.
Источник для ClientSession
:
def __del__(self, _warnings: Any=warnings) -> None:
if self._protocol is not None:
...
_warnings.warn('Unclosed connection {!r}'.format(self),
ResourceWarning,
**kwargs)
...
context = {'client_connection': self,
'message': 'Unclosed connection'}
...
self._loop.call_exception_handler(context) # <---
Таким образом, если вы хотите подавить только предупреждения, которые поступают из aiohttp
библиотеки и через циклОбработчик исключений, вы должны либо
Заменить обработчик исключений цикла по умолчанию
Например, функцией no-op:
async def f():
asyncio.get_running_loop().set_exception_handler(lambda loop, context: None)
...
# No output
или
Измените уровень ведения журнала для всего модуля asyncio
Поскольку обработчик исключений цикла по умолчанию регистрирует сообщения об исключениях с уровнем logging.ERROR
, вам придется установить уровень logging.CRITICAL
import logging
async def f():
logging.getLogger('asyncio').setLevel(logging.CRITICAL)
...
# No output