Мабуть кожен пайтон-дев бачив цю, на перший погляд просту і зручну, конструкцію:
with open('file', 'w+') as file:
file.write('Hello, World')
Але коли вивчаєш пайтон глибше, виникає бажання почати писати щось подібне. Тож, що там під капотом? 🤔
А там ми знайдемо клас, який реалізує магічні методи __enter__ та __exit__, який я розберу іншим разом. У пайтона завжди є простіший метод, тут — за допомогою генератора 🙃
Отож, давайте зробимо свою версію open() 😁
import contextlib
@contextlib.contextmanager
def open(path, mode):
file = File(path, mode)
try:
yield file
finally:
file.close()
*Тип File - вигаданий, для спрощення
Виглядає справді дуже просто, хіба ні?)
Глянемо детальніше, що відбувається:
Спочатку ми створимо файл
Потім “повернемо” (yield) його юзеру
За бажанням, контролюємо дії юзера, ловлячи помилки у блоці try/except
Прибираємо за собою — закриємо файл у блоці finally
Під юзером я маю на увазі вас самих чи ваших колег, які будуть використовувати ваш контекстний менеджер
Цей синтаксис можна пристосувати до своїх побутових чи робочих задач, якщо просто спробувати, рекомендую, бо сам активно використовую 😊
В якомусь майбутньому блозі я наведу наочний приклад використання, а наразі буду радий відповісти на ваші запитання ❤️