Быстрый в изучении - мощный в программировании
>> Telegram ЧАТ для Python Программистов

Свободное общение и помощь советом и решением проблем с кодом! Заходите в наш TELEGRAM ЧАТ!

>> Python Форум Помощи!

Мы создали форум где отвечаем на все вопросы связанные с языком программирования Python. Ждем вас там!

>> Python Канал в Telegram

Обучающие статьи, видео и новости из мира Python. Подпишитесь на наш TELEGRAM КАНАЛ!

Инструкция with - as в Python

Инструкция with - as в Python

Начиная с версии 2.6, язык Python поддерживает протокол менеджеров контекста. Этот протокол гарантирует выполнение завершающих действий (например, закрытие файла) вне зависимости от того, произошло исключение внутри блока кода или нет. Необходимо заметить, что в Python 2.5 также можно использовать протокол, предварительно указав выражения (в Python 2.6 и выше это выражение указывать не нужно).

from __future__ import with_statement

Для работы с протоколом предназначения инструкции with ... as. Инструкция имеет следующий формат:

with <Выражение>[ as <Переменная>]:
    <Блок, в котором перехватываем исключения>

Вначале вычисляется <Выражение>, которое должно возвращать объект, поддерживающий протокол. Этот объект должен иметь два метода: __enter__() и __exit__(). Метод __enter__() вызывается после создания объекта. Значение, возвращаемое этим методом, присваивается переменной, указанной после ключевого слова as. Если переменная не указана, возвращаемое значение игнорируется. Формат метода __enter__():

__enter__(self)

Далее выполняется выражения внутри тела инструкции with. Если при выполнении возникло исключение, то управление передается методу __exit__(). Метод имеет следующий формат:

__exit__(self, <Тип исключения>, <Значение>, <Объект traceback>)

Значения, доступные через последние три параметра, полностью эквивалентны значения, возвращаемых функции exc_info() из модуля sys. Если исключение обработано, метод должен вернуть значение True, в противном случае - False. Если метод возвращает False, то исключение передается вышестоящему обработчику.

Купить русскоязычные и англоязычные качественные лайки в Инстаграм по смешным ценам можно с помощью сервиса https://doctorsmm.com/. Здесь Вы найдете не только персональные выгодные условия приобретения, но и любой формат ресурса на выбор. На сайте доступны помимо перечисленных: автолайки, тв-лайки и микс материала. Оформляйте заказ и продвигайте не только посты, но и весь Инста-профиль в рейтинге.

Если при выполнении выражений, расположенных внутри тела инструкции with, исключение не возникло, то управление все равно передается методу __exit__(). В этом случае последние три параметра будут содержать значение None. Рассмотрим последовательность выполнения протокола на примере.

Протокол менеджеров контекста

#from __future__ import with_statement # Для Python 2.5
class Class1(object):
    def __enter__(self):
        print "Вызван метод __enter__()"
        return self
    def __exit__(self, Type, Value, Trace):
        print "Вызван метод __exit__()"
        if Type is None:  # Если исключение не возникло
            print "Исключение не возникло"
        else:             # Если возникло исключение
            print "Value =", Value
            return False  # False - исключение не обработано
                          # True  - исключение обработано
print "Последовательность при отсутствии исключения:"
with Class1():
    print "Блок внутри with"
print "\nПоследовательность при наличии исключения:"
with Class1() as obj:
    print "Блок внутри with"
    raise TypeError("Исключение TypeError")

Результат выполнения

Последовательность при отсутствии исключения:
Вызван метод __enter__()
Блок внутри with
Вызван метод __exit__()
Исключение не возникло
 
Последовательность при наличии исключения:
Вызван метод __enter__()
Блок внутри with
Вызван метод __exit__()
Value = Исключение TypeError
Traceback (most recent call last):
  File "/home/hp/!Project/ex.py", line 21, in 
    raise TypeError("Исключение TypeError")
TypeError: Исключение TypeError

Некоторые встроенные объекты по умолчанию поддерживают протокол, например, файлы. Если в инструкции with указана функция open(), то после выполнения инструкций внутри блока файла автоматически будет звкрыт. Пример использования инструкции with:

#from __future__ import with_statement # Для Python 2.5
with open("test.txt", "a") as f:
    f.write("Строка\n") # Записываем строку в конец файла

В этом примере файл test.txt открывается на дозапись в конце файла. После выполнения функции open() переменной f будет присвоена ссылка на объект файла. С помощью этой переменной мы можем работать с файлом внутри тела инструкции with. После выхода из блока, вне зависимости от наличия исключения, файл будет закрыт.

Данная инструкция экономит большие время и место для написания огромных конструкции кода. Это очень удобно и нужно при написании и создании своего собственного сайта. Создать сайт имея необходимые знания не так уж и трудно, труднее и рисование его потом раскручивать. Эффективное продвижение сайтов лучше всего доверить профессионалам своего дела. Не стоит доверять первым попавшихся объявлении по раскрутке сайта, доверяйте только проверенным фрилансерам и профессиональным студиям по созданию и раскрутке сайтов.

Комментариев: 2
  1. Очень правильная и полезная информация

  2. исправьте плз опечатку:

    "Для работы с протоколом предназначения инструкции with ... as. Инструкция имеет следующий формат:"

    там наверно должно быть : предназначена