Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 17, 2016 16:13:36

Xion
Зарегистрирован: 2016-01-17
Сообщения: 21
Репутация: +  0  -
Профиль  

[requests] Зачем нужен with?

Зачем для модуля requests предусмотрена конструкция с with:

import requests
with requests.Session() as s:
  s.get('http://python.su/')

В доках написано что with гарантирует закрытие соединения, но может кто написать реальные примеры использования данной конструкции? Есть ли реальная разница с:
requests.get(...

Отредактировано Xion (Янв. 17, 2016 16:13:51)

Офлайн

#2 Янв. 17, 2016 16:37:42

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

[requests] Зачем нужен with?

реальный пример

import requests
with requests.Session() as s:
  s.get('http://python.su/')
в этом примере соединение реально закроется по выходе из with.



Офлайн

#3 Янв. 17, 2016 16:39:31

Xion
Зарегистрирован: 2016-01-17
Сообщения: 21
Репутация: +  0  -
Профиль  

[requests] Зачем нужен with?

Ну я понимаю что оно закроется, но я не понимаю что мешает просто использовать requests.get? ведь результат в обоих случаях будет получен, если присвоить результат переменной

Офлайн

#4 Янв. 17, 2016 16:40:03

alex925
Зарегистрирован: 2015-01-08
Сообщения: 204
Репутация: +  14  -
Профиль   Отправить e-mail  

[requests] Зачем нужен with?

Xion
requests.get(…
В таком случае у тебя у тебя не создается сессия, закрывать нечего (точнее там в кишках все само происходит).

Офлайн

#5 Янв. 17, 2016 16:42:06

alex925
Зарегистрирован: 2015-01-08
Сообщения: 204
Репутация: +  14  -
Профиль   Отправить e-mail  

[requests] Зачем нужен with?

Xion
но я не понимаю что мешает просто использовать requests.get?
Сессию используют если нужно сделать не 1 запрос к сайту, а не сколько. Тогда у тебя каждый раз не создается новая сессия и запрос происходит быстрее + если ты на пример в результате сессии авторизуешься на сайте, то куки у тебя будут автоматом посылаться и ты будешь работать как авторизованный пользователь.

Офлайн

#6 Янв. 17, 2016 16:44:16

Xion
Зарегистрирован: 2016-01-17
Сообщения: 21
Репутация: +  0  -
Профиль  

[requests] Зачем нужен with?

alex925
куки у тебя будут автоматом посылаться
Вот это я и хотел услышать, а то я даже в session делал:
r = s.get...
r2 = s.get... cookies=r.cookies ...

Офлайн

#7 Янв. 17, 2016 16:44:49

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

[requests] Зачем нужен with?

Суть в том, что этот код может быть внутри функции. Вызов функции падает с ошибкой, внешний код обрабатывает ошибку и (допустим) сообщает пользователю, что при чтении файла произошёл нежданчик.
Пользователь тыкает кнопку еще раз - и получает еще одну ошибку “Файл уже открыт в другой программе”.
with гарантирует, что файл будет закрыт независимо от того, как отработал ваш вызов функции и повторное его открытие не вызовет неожиданных проблем.



Офлайн

#8 Янв. 17, 2016 16:45:56

Xion
Зарегистрирован: 2016-01-17
Сообщения: 21
Репутация: +  0  -
Профиль  

[requests] Зачем нужен with?

FishHook
with гарантирует, что файл будет закрыт
with с open для меня ясен, спасибо, у меня по requests был основной вопрос

Офлайн

#9 Янв. 17, 2016 16:47:36

alex925
Зарегистрирован: 2015-01-08
Сообщения: 204
Репутация: +  14  -
Профиль   Отправить e-mail  

[requests] Зачем нужен with?

Xion
у меня по requests был основной вопрос
а выглядело наоборот….

Офлайн

#10 Янв. 17, 2016 17:02:53

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

[requests] Зачем нужен with?

Xion
with с open для меня ясен, спасибо, у меня по requests был основной вопрос
Да какая разница то, мыслите ширее. Что-то будет сделано независимо от действий программиста. В том и дело, чтобы вы не думали о последствиях. Файл вы открываете, слот, соединение какое-то, да что угодно, суть в том, что любые ваши действия внутри with завершатся корректно в отношении контекста with. Вы можете свой класс написать, который будет работать с with. Что будет происходить по выходе из with вашего класса будете знать только вы.



Отредактировано FishHook (Янв. 17, 2016 17:04:55)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version