Быстрый в изучении - мощный в программировании
Скрипт ИНВЕСТОР на Python

Попробуйте себя в качестве инвестора имея в помощники мощный алгоритм советника на Python...

Все уроки по PyQt5

PyQt5 реализован как комплект Python-модулей. Он включает в себя около 620 классов и 6000 функций и методов...

Скрипт отправки SMS через Python

Была задача отправить SMS-ки большому списку номеров телефона с уточнением цены за всю рассылку "До" ее отправки...

Инструкция 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, то исключение передается вышестоящему обработчику.

Если при выполнении выражений, расположенных внутри тела инструкции 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. После выхода из блока, вне зависимости от наличия исключения, файл будет закрыт.

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

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru yandex.ru
Комментариев: 1
  1. Очень правильная и полезная информация

Оставьте комментарий!

Используйте нормальные имена.

Имя и сайт используются только при регистрации

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

(обязательно)