Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Створення Власних Менеджерів Контексту | Розширена Робота з Файлами та Менеджери Контексту
Структурне програмування на Python

Створення Власних Менеджерів Контексту

Свайпніть щоб показати меню

Щоб повністю використати можливості менеджерів контексту в Python, можна створити власний, визначивши клас із методами __enter__ та __exit__. Метод __enter__ викликається при вході у контекст оператора with, і його значення повернення присвоюється змінній після as. Метод __exit__ викликається при виході з контексту, незалежно від того, чи завершився блок нормально, чи через виключення. Такий підхід дозволяє безпечно та передбачувано налаштовувати й звільняти ресурси, що особливо корисно для роботи з файлами, мережевими з'єднаннями або блокуваннями.

Метод __exit__ приймає три аргументи: exc_type, exc_value та traceback. Вони містять інформацію про будь-яке виключення, що виникло всередині контекстного блоку. Якщо __exit__ повертає True, виключення буде придушене; інакше, після очищення ресурсів, воно буде передане далі. Реалізуючи ці методи, можна точно контролювати логіку ініціалізації та очищення ресурсів, роблячи код більш надійним і підтримуваним.

class FileLogger:
    def __init__(self, filename, logname):
        self.filename = filename
        self.logname = logname
        self.file = None
        self.log = None

    def __enter__(self):
        self.file = open(self.filename, "r")
        self.log = open(self.logname, "a")
        self.log.write(f"Opened file: {self.filename}\n")
        return self.file

    def __exit__(self, exc_type, exc_value, traceback):
        if self.file:
            self.file.close()
            self.log.write(f"Closed file: {self.filename}\n")
        if self.log:
            self.log.close()
        # Do not suppress exceptions
        return False

Наступний код демонструє клас власного менеджера контексту FileLogger. Цей клас призначений для відкриття цільового файлу для читання та лог-файлу для додавання записів. При вході у контекст (за допомогою оператора with) фіксується подія відкриття файлу у журналі. При виході з контексту — як у разі нормального виконання, так і при виникненні виключення — фіксується подія закриття файлу та гарантується коректне закриття обох файлів. Метод __exit__ не пригнічує виключення, дозволяючи їм передаватися далі після очищення ресурсів.

question mark

Яке твердження найкраще описує роль методу __exit__ у власному менеджері контексту?

Виберіть правильну відповідь

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 2. Розділ 5

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Секція 2. Розділ 5
some-alt