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

Контекстные менеджеры в Python

Что такое контекстные менеджеры? Когда их использовать? Как написать свой собственный? Теги с Python, Contexmanagers, декораторами, генераторами.

Контекстные менеджеры В Python помогает пользователю эффективно управлять ресурсами в программе I.E открытие или закрытие ресурса или блокировки или разблокировки ресурса. Контекстные менеджеры приходят удобно, когда мы должны управлять ресурсом до и после события.

Наиболее распространенным контекстно-менеджером, который каждый программист Python использует очень часто для управления файлами, является A С как утверждение.

with open('MyContextManager.txt') as f:
    f.write('Using Context Manager is FUN !')

Приведенный выше фрагмент кода имеет в основном два преимущества:

  • Помогает автоматически закрывать ресурсы и эффективно. Это может быть небольшой код код, поэтому может быть немного очевидно, что файл был открыт и замкнут должным образом, но, если при увеличении объема функции? Вот почему контекстные менеджеры действительно вошли в картину.
  • Делает код читаемой и сложной логикой простой. Приведенный выше код также можно записать как:
file = open('MyContextManager.txt','W')
try:
    file.write('Not using a Context Manager.')
finally:
    file.close()    

Здесь мы управляем открытием и закрываем файла вручную с попробуйте, наконец утверждение.

Стандартная библиотека Python поставляется с модулем, Contextlib . Это содержит утилиты для работы с контекстными менеджерами и с утверждение.

Написание собственного контекста менеджера

Так почему кто-то хочет написать свои собственные контекстные менеджеры?

Потому что контекстные менеджеры являются лучшими для управления ресурсами до и после события. Таким образом, вам не нужно беспокоиться о распределении/девистании или блокировке/разблокировке или открытии/закрытии.

Кроме того, они делают код простым и читаемым.

Написание вашего контекстно-менеджера можно сделать двумя способами, либо создать свой класс или использовать Contextlib Модуль для создания декоратора менеджера контекста.

Давайте сначала посмотрим, как мы можем создать простой Контекстно-менеджер класса Отказ Класс Context Manager состоит из двух основных методов Введите и Выход Отказ Если вы знакомы с тестированием, вы можете сравнить эти два метода с настройкой и разрывом.

Как и в каждом классе в Python, init Метод необязательно. Но в случае контекстных менеджеров мы используем init только если мы используем с как утверждение. init должен быть принято имя, которое вы хотите связать с как в с как утверждение.

Теперь давайте посмотрим на простую игру престола, вдохновленные контекстманагеру, которые создают Дикт домашних символов.

“ `Pythonjust, как каждый класс, как каждый класс в Python, init Метод необязательно, только если вы используете с * утверждением. Если вы используете * с AS Заявление о том, должно быть принято имя, которое вы хотите связать с как в с как утверждение. в Python, init Метод необязательно, только если вы используете с * утверждением. Если вы используете * с AS Заявление о том, должно быть принято имя, которое вы хотите связать с как в с как утверждение. Класс ThronescontextManager: def init (Само, бесплатно):

def __enter__(self):
    print("Enter: {}".format(self.HouseSymbol)")
    return self.HouseSymbol

def __exit__(self, *exc):
    print("Exit: {}".format(self.HouseSymbol))

с престолами ContextManager ({“Дом Старк”: “Волк”}) как символ лошади:

«« »— Выход — Enter: {‘House Stark’: ‘Wolf’} Выход: {‘House Stark’:« Волк »,« Таргарин »:« Три возглавляя дракон »}« »




* The init method takes in the dict associated with the *as* in the *with-as* statement. It creates an instance of the class and assigns it to the dict. Much similar to any normal Python Class.
* The *enter* method is called by the *with* and is passed the dict. It returns the value which is associated with the dict(HouseSymbol).
*  The *exit* takes in the exception(*exc) these are of mainly three types exc: exception, exc_type: exception type and exc_tb: exception_traceback. 
*  If for some reason you want the program to ignore the exception you can also return True to just ignore the exception.


Now taking a look at the above code example we can say that any Context Manager is one which as two methods an *enter* method and an *exit* method. 

Before moving forward to *contextmanager decorator* let's break down the code snippit we saw in the starting of the post and see how it works behind the hood. 

Since we know how context managers work it won't be difficult to the observer what's happening when we call *with as* statement while opening a file.




```Python
with open('MyContextManager.txt') as f:
    f.write('Using Context Manager is FUN !')
  1. С называет Введите Способ файлового класса.
  2. Введите Метод открывает файл и возвращает его.
  3. Открытая обработка файлов передается F Отказ
  4. Мы пишем в файл, используя .write () Отказ
  5. С заявлением вызывает Выход метод.
  6. Выход Проверяет исключения, если исключение не найдено, он закрывает файл.

Чем проще написать контекстный менеджер, используя Contextlib Модуль и создание Диспетчер контекста декоратор Отказ

Хорошая вещь в использовании @ContextManager Разве это создает метод ввода и выхода для вас так автоматически. Таким образом, мы можем преобразовать функцию генератора в декоратор ContextManager.

Давайте снова напишите ThronesconextManager снова, но с @Thronesconextexmanager Отказ

from contextlib import contextmanager

@contextmanager
def ThronesContextManager(data):
    print("Enter: {}".format(data))
    yield data 
    print("Exit: {}".format(data))

with ThronesContextManager({"House Stark": "Wolf"}) as HouseSymbol:
    HouseSymbol["Targaryen"] = "Three Headed Dragon"

"""
---Output---
Enter: {'House Stark': 'Wolf'}
Exit: {'House Stark': 'Wolf', 'Targaryen': 'Three Headed Dragon'}
"""

Пирандом

Вот некоторые вещи, интересные вещи, которые я нашел о контекстуманагерах. Они были найдены, когда я исследую для этого поста в блоге, поэтому я добавляю это в раздел Пирандом Отказ Я буду постоянно обновлять этот раздел, как я узнаю больше о контекстных менеджерах.

  • Контекстные менеджеры не создают отдельную новую область в программе I.E переменные, определенные внутри САС Блок будет доступен после выполнения блока.
with open('MyContextManager.txt') as f:
    # Variable defined inside the Context Manager
    VariableName = f.read()
print(VariableName)
  • При использовании нескольких ContextManager в A САС Заявить поток Введите и Выход Заявление становится Lifo (последний В первом месте) I.e Введите метод, который называется последним, будет иметь его метод выхода первым.
import contextlib

@contextlib.contextmanager
def make_context(name):
    print ('entering:', name)
    yield name
    print ('exiting :', name)

with make_context('A') as A, make_context('B') as B, make_context('C') as C:
    print ('inside with statement:', A, B, C)

"""
---OUTPUT---
entering: A
entering: B
entering: C
inside with statement: A B C
exiting : C
exiting : B
exiting : A
"""
Что теперь ?

Поскольку мы охватываем все основные вещи на контекстных менеджерах, мы можем начать углубиться более глубоким и научиться использовать контекстные менеджеры в более реальном случае использования. Так вот некоторые вещи, которые я хотел бы, чтобы вы прочитали больше об этом.

  • Узнайте, как обрабатывать исключения в/с контекстными менеджерами.
  • Попробуйте найти реальные случаи использования проекта, где использование менеджера контекста будет лучше всего подходит.
  • Узнайте роль init и Введите в контексте.
Все еще не может насытиться?

Причина блога в том, что я недавно выбрал проблему на Python, которая идет что-то вроде этого

Напишите менеджер контекста с именем Supper, который подавляет исключение данного типа/типов I.E, если поднимается заданный тип исключения, что исключение должно быть поймано и приглушено в некотором смысле.

Пример кода:

>>> x = 0
>>> with suppress(ValueError):
...     x = int('hello')
...
>>> x
0
>>> with suppress(ValueError, TypeError):
...     x = int(None)
...
>>> x
0

Так как вы прочитаете это далеко, я предполагаю, что вы только начинаете узнавать об этой теме. Давайте поставим в тест, насколько вы узнали до сих пор и получите опыт записи вашего менеджера контекста. Попробуйте решить эту проблему.

Я все еще решаю проблему, и как только это будет сделано, я бы связывал мое решение здесь.

Счастливое кодирование 😄.

Оригинал: “https://dev.to/pradhvan/context-managers-in-python-26ng”