Рубрики
Без рубрики

Python с заявлением – с открытым файлом

Python с заявлением позволяет нам писать более простой код при работе с контекстными менеджерами. С заявлением было введено в Python 2.5 под PEP 343.

Автор оригинала: 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 с заявлением о том, чтобы управлять жизненным циклом контекста менеджера. Код выглядит маленьким и удаляет шанс оставлять менеджер контекста, открытый из-за плохого программирования.

8. Ссылки