Я новичок в Python и читаю код другого:
должен urllib.urlopen() следовать urllib.close()? В противном случае можно было бы утекнуть соединения, исправить?
Я новичок в Python и читаю код другого:
должен urllib.urlopen() следовать urllib.close()? В противном случае можно было бы утекнуть соединения, исправить?
Метод close должен быть вызван на результат urllib.urlopen, не в самом модуле urllib, о чем вы думаете (как вы упомянули urllib.close), который не существует).
Лучший подход: вместо x = urllib.urlopen(u) и т.д. используйте:
import contextlib
with contextlib.closing(urllib.urlopen(u)) as x:
...use x at will here...
Оператор with и менеджер контекста closing обеспечат правильное закрытие даже при наличии исключений.
Как и @Peter, открытые URL-адреса вне сферы видимости станут подходящими для сбора мусора.
Однако также обратите внимание, что urllib.py определяет:
def __del__(self):
self.close()
Это означает, что , когда счетчик ссылок для этого экземпляра достигнет нуля, его метод __del__ будет вызван, и поэтому его метод close также будет вызываться. Самый "нормальный" способ подсчета ссылок достигнуть нуля - это просто позволить экземпляру выйти из области видимости, но там ничего строго не останавливает вас от явного del x раньше (однако он не вызывает непосредственно __del__, а просто уменьшает количество ссылок на единицу).
Конечно, хороший стиль для явного закрытия ваших ресурсов - особенно когда ваше приложение рискует использовать слишком много указанных ресурсов, но Python автоматически очистит вас, если вы не сделаете ничего смешного, как поддержание (круговое?) ссылки на примеры, которые вам больше не нужны.
urllib выходит за пределы области действия, соединение будет закрыто автоматическим сборщиком мусора.