Я изменяю некоторый код, чтобы он был совместим между Python 2
и Python 3
, но в выводе модульного теста появилось предупреждение.
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/case.py:601:
ResourceWarning: unclosed socket.socket fd=4,
family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=6,
laddr=('1.1.2.3', 65087), raddr=('5.8.13.21', 8080)
Небольшое исследование показало, что это также происходит из популярных библиотек, таких как запросы и boto3.
Я мог проигнорировать предупреждение или отфильтровать его полностью. Если бы был мой сервис, я мог бы установить connection: close
заголовок в моем ответе (ссылка).
Вот пример, который демонстрирует предупреждение в Python 3.6.1
:
app.py
import requests
class Service(object):
def __init__(self):
self.session = requests.Session()
def get_info(self):
uri = 'http://api.stackexchange.com/2.2/info?site=stackoverflow'
response = self.session.get(uri)
if response.status_code == 200:
return response.json()
else:
response.raise_for_status()
def __del__(self):
self.session.close()
if __name__ == '__main__':
service = Service()
print(service.get_info())
test.py
import unittest
class TestService(unittest.TestCase):
def test_growing(self):
import app
service = app.Service()
res = service.get_info()
self.assertTrue(res['items'][0]['new_active_users'] > 1)
if __name__ == '__main__':
unittest.main()
Существует ли лучший/правильный способ управления сеансом, чтобы он был закрыт в явном виде и не полагался на __del__()
для получения такого рода предупреждений.
Спасибо за любую помощь.