Для чего используется Python с оператором? - PullRequest
4 голосов
/ 28 сентября 2010

Я пытаюсь понять оператор with в python. Куда бы я ни посмотрел, он говорит об открытии и закрытии файла и предназначен для замены блока try-finally. Может ли кто-нибудь опубликовать и другие примеры? Я просто пробую флягу, и в ней много заявлений. Обязательно попросите кого-нибудь прояснить ситуацию.

Ответы [ 3 ]

9 голосов
/ 08 февраля 2011

Идея утверждения with состоит в том, чтобы сделать «правильные поступки» путем наименьшего сопротивления. В то время как пример файла является самым простым, поточные блокировки фактически предоставляют более классический пример неочевидного глючного кода:

try:
    lock.acquire()
    # do stuff
finally:
    lock.release()

Этот код не работает - если получение блокировки когда-либо завершится неудачно, будет сгенерировано неправильное исключение (поскольку код попытается снять блокировку, которую он никогда не получал), или, что еще хуже, если это рекурсивная блокировка, он будет выпущен рано. Правильный код выглядит так:

lock.acquire()
try:
    # do stuff
finally:
    # If lock.acquire() fails, this *doesn't* run
    lock.release()

Используя оператор with, невозможно ошибиться, так как он встроен в менеджер контекста:

with lock: # The lock *knows* how to correctly handle acquisition and release
  # do stuff

Другое место, где очень полезен оператор with, аналогично главному преимуществу декораторов функций и классов: он принимает код из двух частей, который может быть разделен произвольным числом строк кода (определение функции для декораторов - блок try в текущем случае) и превращает его в «цельный» код, где программист просто объявляет, что он пытается сделать.

Для коротких примеров это не выглядит большим выигрышем, но на самом деле это имеет огромное значение при просмотре кода. Когда я вижу lock.acquire() в куске кода, мне нужно прокрутить вниз и проверить соответствующий lock.release(). Когда я вижу with lock:, такая проверка не требуется - я сразу вижу, что блокировка будет снята правильно.

9 голосов
/ 28 сентября 2010

Есть очень хорошее объяснение здесь .По сути, оператор with вызывает два специальных метода для связанного объекта.Методы __enter__ и __exit__.Метод enter возвращает переменную, связанную с оператором «with».В то время как метод __exit__ вызывается после выполнения оператора для обработки любой очистки (такой как закрытие указателя файла).

1 голос
/ 01 августа 2011

Существует двенадцать примеров использования with в PEP343 , включая пример открытия файла:

  1. Шаблон для обеспечения блокировки, полученной в началеблок освобождается, когда блок остается
  2. Шаблон для открытия файла, который обеспечивает закрытие файла при оставлении блока
  3. Шаблон для фиксации или отката транзакции базы данных
  4. Пример 1 переписан без генератора
  5. Временно перенаправить стандартный вывод
  6. Вариант функции open (), который также возвращает условие ошибки
  7. Другим полезным примером может бытьоперация, которая блокирует сигналы
  8. Другое использование этой функции - десятичный контекст
  9. Вот простой диспетчер контекста для десятичного модуля
  10. Универсальный диспетчер контекста «закрытие объекта»
  11. контекст release () для временного освобождения ранее полученной блокировки путем замены вызовов acqu () и release () на вызовы
  12. «вложенный» менеджер контекста, которыйt автоматически вкладывает предоставленные контексты слева направо, чтобы избежать чрезмерного отступа
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...