IO classes as context managers
For those who don't know, context managers are classes that can be used with python with statements. I think it would be beneficial for IO classes to be able to be used as context managers. This would provide a safe way to handle cleanup operations after running.
To create a context manager, you need two methods, __enter__ and __exit__. For us, __enter__ would probably open the file, while __exit__ would close it.
So I suggest that at the BaseIO level we implement abstract open and close methods that subclasses could re-implement to handle any cleanup. Then BaseIO would implement __enter__ and __exit__ methods that just call open and close, respectively.
So someone could just do this:
with ExampleIO(fname) as ioobj:
data = ioobj.read()
People wouldn't need to know or care about specific cleanup operations they need to do with particular IO classes.
+1, this would be great.
It sounds good.
Sure, we can do it in the next round of IO changes.
But it will change the way IOs are used: Currently IOs open and close files automatically. So existing code would not work anymore because it doesn't call open() and it would not clean up because it doesn't call close().
That would be necessary anyway if we are going to support iteration as in #177.
True. I think there is consensus since we are changing the API anyway. We can include it in the next round of IO changes. There are only two IOs left for this round, so we could start with that soon.
Can this be implemented in the basefromrawio so all IOs can be used as context managers? Currently only the NixIO has this feature.
I think yes. Let see after #461