Для чего используется python "с" оператором?

StackOverflow https://stackoverflow.com/questions/3813886

  •  26-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь понять с заявлением в Python. Везде я выгляжу так, разговаривает о открытии и закрытии файла и предназначен для замены блока TRY-CACE. Может ли кто-нибудь опубликовать некоторые другие примеры тоже. Я просто пробую колбу, и в этом есть с заявлениями в этом. Определенно просит кого-то оказывать на нем некоторую четкость.

Это было полезно?

Решение

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

Другие советы

Идея 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()

Используя A. with Заявление, становится невозможно сделать это неправильно, так как он встроен в контекстный менеджер:

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

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

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

Есть двенадцать примеров использования with в Pep343., включая пример открытого файла:

  1. Шаблон для обеспечения того, чтобы замок, приобретенный в начале блока, выделяется, когда блок оставлен
  2. Шаблон для открытия файла, который гарантирует, что файл закрыт, когда блок остается
  3. Шаблон для совершения или отказа от транзакции базы данных
  4. Пример 1 переписан без генератора
  5. Redirect Stdout временно
  6. Вариант на открытом (), который также возвращает условие ошибки
  7. Другим полезным примером будет операция, которая блокирует сигналы
  8. Другое использование для этой функции является десятичным контекстом
  9. Вот простой контекстный менеджер для десятичного модуля
  10. Общее «объектное закрытие» менеджер контекста
  11. Выпущенный () контекст, чтобы временно освободить ранее приобретенный замок, заменяя вызовы приобретения () и выпуска ()
  12. «Вложенный» менеджер контекста, который автоматически устанавливает прилагаемые контексты из левой вправо, чтобы избежать чрезмерных углублений
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top