EvilsInterrupt
@EvilsInterrupt
System programming, Reversing Engineering, C++

Как надо и как не надо использовать менеджеры контекстов?

Думаю, любому python-девелоперу знакома конструкция:

with BLA-BLA-BLA as b:
   b.do_something()


Сегодня в очередной раз столкнулся с этой конструкцией при чтении кода на одном из гитхаб-проектов.
Однако, я никогда эту конструкцию не применял. Даже и мысли не возникало. Всегда находился способ проще.
Но сегодня задумался: А может что-то упустил? Может есть какие-то выгоды?

Опишите свои причины использования механизма написания менеджера контекста. В каких ситуациях Вы их используете и почему?

UPD:
Из ответов складывается ощущение, что менеджер контекста нужен для ситуаций, когда нужно автоматизировать завершающие действия, к примеру закрытие файла. Другими словами это аналог умного указателя из мира C++.

Все так?

P.S.:
Вопрос не про то как написать. То есть НЕ про то, что надо написать в __enter__() , __exit__() методах. А про best practice
  • Вопрос задан
  • 757 просмотров
Пригласить эксперта
Ответы на вопрос 3
ptitca_zu
@ptitca_zu
Programmer. Reader. Introvert
Я например в контекст оборачиваю коннекты к БД или маунты шар для тестов.
Вот, например:

@contextmanager
    def _new_connection(self):
        conn = None
        try:
            conn = sqlite3.connect(self.db_file)
            conn.cursor().execute(CREATE_TABLE % 'tasks (task_id, cc_id, expired)')
            conn.cursor().execute(CREATE_TABLE % 'task_actions (task_id, action)')
            conn.commit()
            yield conn
        except sqlite3.DatabaseError as e:
            pass
        finally:
            if conn:
                conn.close()
Ответ написан
Собственно очевидные варианты, работа с ресурсами - файлы. конекты к бд, они уже все готовы для работы с менеджерами контекста.

допустим так: Как мониторить медленные и прожорливые места скрипта?

как видится мне:
  • Использовать для гарантии выполнения каких либо действий, после определённого участка кода, даже если в нём произошли исключения, код с менеджерами в этом случае выглядит гораздо компактнее
  • Использовать как некое подобие декоратора, но не для функции, а для произвольных участков кода, их можно добавить можно убрать, функциональность обёртываемого кода при этом не меняется.
Ответ написан
Shmele
@Shmele
Python developer
В тестах менеджеры контекста - крайне удобная штука.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы