Автор оригинала: Pankaj Kumar.
Python с заявлением позволяет нам писать более простой код при работе с контекстными менеджерами. С заявлением было введено в Python 2.5 под PEP 343 Отказ
1. Что такое контекстный менеджер?
Менеджер контекста – это объект, который создает и управляет контекстом выполнения. Типичное использование контекстных менеджеров является сохранение и восстановление глобального состояния, блокировки и разблокировки ресурсов, открытия и закрытия файлов и т. Д.
2. Жизненный цикл контекстно-менеджера
Объект Context Manager должен определить Enter () и Выход () методы. Эти методы вызываются при создании контекста выполнения и когда он разрушен.
3. Почему нам нужен python с заявлением?
Когда мы должны работать с файлом, мы должны сначала открыть его. Он создает менеджер контекста выполнения для файла. После выполнения работы мы должны вручную закрыть файл, чтобы менеджер контекста заканчивался правильно.
Как правило, мы используем блок TRY-BLOCK для работы с файлом и, наконец, блокируйте, чтобы закрыть файл. Это гарантирует, что файл закрывается, даже если произошла ошибка блока TRY.
try: txt_file = open("abc.txt") # do some operations txt_file.close() except FileNotFoundError as e: print(e) finally: txt_file.close()
Python с заявлением позаботится о вызове () метода контекста менеджера при выполнении кода внутри блока.
Давайте переписам вышеуказанный код, используя с помощью оператора.
with open("abc.txt") as file: # do some operations print("Done")
Код гораздо проще читать, и нам не нужно беспокоиться о закрытии файла каждый раз.
4. Python с заявлением Custom Custom Context Manager Пример
Мы можем определить наш собственный пользовательский менеджер контекста, выполнив ввод () и выездных () методов.
class MyContext: def __init__(self): print("init method of MyContext") def __enter__(self): print("entering context of MyContext") def __exit__(self, exc_type, exc_val, exc_tb): print("exit context of MyContext") with MyContext() as my_context: print("my_context code")
Выход:
init method of MyContext entering context of MyContext my_context code exit context of MyContext
- Диспетчер контекста инициализируется.
- Затем метод __enter __ () вызывается для объекта Context Manager.
- Код внутри блока выполнен.
- Наконец, это метод __exit __ () менеджера контекста называется.
5. Python с открытыми файлами
Python 3.1 Улучшил оператор для поддержки нескольких контекстных менеджеров. Давайте посмотрим, как открыть несколько файлов, используя с помощью оператора.
with open("abc.txt") as file1, open("abc.txt") as file2: pass
Приведенный выше код эквивалентен нескольким вложенным с заявлениями.
with open("abc.txt") as file1: with open("abc.txt") as file2: pass
6. Python с сценариями исключения
Если есть исключение, поднятое в блоке с блоком, его тип, значение и Traceback пропускаются как аргументы __exit __ ().
Если метод __exit __ () возвращает false, то исключение воспитывается.
class MyContext: def __init__(self): print("init method of MyContext") def __enter__(self): print("entering context of MyContext") def __exit__(self, exc_type, exc_val, exc_tb): print(f'exit context of MyContext - {exc_type} :: {exc_val} :: {exc_tb}') return False with MyContext() as my_context: print("my_context code") raise TypeError("TypeError inside with block")
Выход:
init method of MyContext entering context of MyContext my_context code exit context of MyContext -:: TypeError inside with block :: Traceback (most recent call last): File "/Users/pankaj/Documents/PycharmProjects/hello-world/journaldev/with_statement.py", line 32, in raise TypeError("TypeError inside with block") TypeError: TypeError inside with block
Если метод __exit __ () возвращает true, то исключение потребляется, а обычное выполнение продолжается.
class MyContext: def __init__(self): print("init method of MyContext") def __enter__(self): print("entering context of MyContext") def __exit__(self, exc_type, exc_val, exc_tb): print(f'exit context of MyContext - {exc_type} :: {exc_val} :: {exc_tb}') return True with MyContext() as my_context: print("my_context code") raise TypeError("TypeError inside with block") print("Done")
Выход:
init method of MyContext entering context of MyContext my_context code exit context of MyContext -:: TypeError inside with block :: Done
7. Заключение
Python с заявлением о том, чтобы управлять жизненным циклом контекста менеджера. Код выглядит маленьким и удаляет шанс оставлять менеджер контекста, открытый из-за плохого программирования.