Створення Власних Менеджерів Контексту
Свайпніть щоб показати меню
Щоб повністю використати можливості менеджерів контексту в 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__ не пригнічує виключення, дозволяючи їм передаватися далі після очищення ресурсів.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат