Привет, Хабр!
Я не знаю, как у вас, а у меня перед глазами все еще маячат толстенные исходники WinForms-эра на C#, где любой порядочный объект, умеющий держать ручку к файлу или сокету, строго реализует IDisposable
. Закрыл — молодец, забыл — получи warning от IDE и пару нехороших утечек в production.
В Python, увы-ях, аналогичный контракт традиционно строили на del
и контекст-менеджерах. Первый: если объект в циклическом мусоре, финализатор может не вызваться вообще; к тому же при выключении интерпретатора порядок разрушения объектов хаотичен. Второй (with ... as
) шикарен, но требует явного вызова, а значит — дисциплины.
С выходом PEP 442 и появлением weakref.finalize
мы получили «почти IDisposable» — финализатор, которому не страшны циклы, и который честно отработает даже на shutdown, если правильно обращаться.