[Python-Dev] Why does IOBase.__del__ call .close?

MRAB python at mrabarnett.plus.com
Wed Jun 11 03:51:43 CEST 2014


On 2014-06-11 02:30, Nikolaus Rath wrote:
> Hello,
>
> I recently noticed (after some rather protacted debugging) that the
> io.IOBase class comes with a destructor that calls self.close():
>
> [0] nikratio at vostro:~/tmp$ cat test.py
> import io
> class Foo(io.IOBase):
>      def close(self):
>          print('close called')
> r = Foo()
> del r
> [0] nikratio at vostro:~/tmp$ python3 test.py
> close called
>
> To me, this came as quite a surprise, and the best "documentation" of
> this feature seems to be the following note (from the io library
> reference):
>
> "The abstract base classes also provide default implementations of some
>   methods in order to help implementation of concrete stream classes. For
>   example, BufferedIOBase provides unoptimized implementations of
>   readinto() and readline()."
>
> For me, having __del__ call close() does not qualify as a reasonable
> default implementation unless close() is required to be idempotent
> (which one could deduce from the documentation if one tries to, but it's
> far from clear).
>
> Is this behavior an accident, or was that a deliberate decision?
>
To me, it makes sense. You want to make sure that it's closed, releasing
any resources it might be holding, even if you haven't done so
explicitly.



More information about the Python-Dev mailing list