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

Контекстные менеджеры – понимание Python с ключевым словом

Python с заявлением очень полезно. Это было там, так как Python 2.5, и это была постоянная функция, используемая почти каждый Python

Автор оригинала: Pankaj Kumar.

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

Что такое полезно об этом утверждении, так что все это использует?

Самое полезное (единственное, на самом деле!) Это то, что он открывает и освобождает ресурсы.

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

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

Почему нам нужно менеджеры контекста?

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

# Open the file
file_obj = open('input.txt', 'r')

# File operations come here
...

# Manually close the file
file_obj.close()

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

с Заявление имеет контекст (блок), под которым он действует. Это из этого как объем заявления.

Когда программа выходит из этого контекста, с автоматически закрывает ваш файл!

Благодаря этому, с часто называют как Диспетчер контекста Отказ

Таким образом, те же процедуры обработки файлов могут быть использованы, наряду с с утверждение:

with open('input.txt', 'r') as file_obj:
    ...

Обратите внимание, как это очень интуитивно. Python с Заявление будет всегда Закройте файл в конце, даже если программа ненормально заканчивается даже в контексте/блок.

Эта функция безопасности делает его принятым (и рекомендуемым) выбором для всех программистов Python!

Использование Python с оператором

Теперь, пока есть много классов, которые реализовали объект для использования с , мы заинтересованы в поисках того, как это работает, чтобы мы могли написать один сами!

  • Во-первых, с Заявление хранит ссылку на объект в объекте контекста.

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

Итак, есть какое-то значение для хранения ссылки на объект!

Теперь давайте перейдем дальше. После создания контекста создан, он называет __enter__ Дундер Метод на объекте.

  • __enter__ Заявление – это тот, который фактически делает работу в открытии ресурсов для объекта, такой как файл/сокет. Обычно мы можем реализовать его на Сохранить Состояние объекта контекста, если это необходимо.

Теперь помните как ключевое слово? Это на самом деле возвращает объект контекста. Так как нам нужен возвращенный объект Открыть () мы используем как Ключевое слово для получения объекта контекста.

Использование как Необязательно, особенно если у вас есть ссылка на оригинальный объект контекста где-то еще.

После этого мы вводим вложенный блок из заявлений.

Как только вложенный блок закончился, Или В случае, если в этом есть исключение в этом, программа всегда Выполняет __exit__ Метод на объекте контекста!

Это первая функция безопасности, которую мы говорили ранее. Так что независимо от того, что происходит, мы всегда будем использовать __exit__ освободить ресурсы и выйти из контекста.

Наконец, если это осуществимо, __exit__ может быть реализован так как Восстановить Состояние объекта контекста, так что оно возвращается к тому, что он принадлежит ему.

Хорошо, это было довольно длинное объяснение. Чтобы сделать это более понятнее, давайте просмотрим пример создания нашего собственного контекста-менеджера для класса.

Создание наших собственных контекстных менеджеров для нашего класса

Рассмотрим класс ниже, для которого у нас будет собственный менеджер контекста для обработки файлов.

class MyFileHandler():
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode
        # Originally, context object is None
        self.context_object = None


    # The context manager executes this first
    # Save the object state
    def __enter__(self):
        print("Entered the context!")
        self.context_object = open(self.filename, self.mode)
        return self.context_object


    # The context manager finally executes this before exiting
    # Information about any Exceptions encountered will go to
    # the arguments (type, value, traceback)
    def __exit__(self, type, value, traceback):
        print("Exiting the context....")
        print(f"Type: {type}, Value: {value}, Traceback: {traceback}")
        # Close the file
        self.context_manager.close()
        # Finally, restore the context object to it's old state (None)
        self.context_object = None

# We're simply reading the file using our context manager
with MyFileHandler('input.txt', 'r') as file_handle:
    for line in file_handle:
        print(line)

Соблюдайте методы класса внимательно. У нас есть __init__ Способ нашего обработчика, который устанавливает начальное состояние объектов контекста и соответствующие переменные.

Теперь __enter__ Метод DUNDER сохраняет состояние объекта и открывает файл. Теперь мы находимся внутри блока.

После выполнения блока менеджер контекста выполняет __exit__ Наконец, где исходное состояние объекта контекста восстанавливается, и файл закрыт.

Хорошо, теперь давайте проверим наш выход сейчас. Это должно работать!

Выход

Entered the context!
Hello from AskPython

This is the second line

This is the last line!
Exiting the context....
Type: None, Value: None, Traceback: None

Хорошо, кажется, у нас нет ошибок! Мы только что реализовали свои собственные контекстные менеджеры для нашего пользовательского класса.

Теперь есть еще один подход создания контекстно-менеджера, который использует генераторы.

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

Но с целью полноты вы можете посмотреть на использование этого подхода здесь Отказ Я бы порекомендовал прочитать это, как только вы знакомы с подходом на основе класса.

Заключение

В этой статье мы узнали об использовании контекстных менеджеров в Python, используя с утверждение.

Рекомендации