On Mon, Nov 18, 2019, at 12:46, Paul Moore wrote:
> But open() isn't designed *just* to be used in a with statement. It
> can be used independently as well. What about
> 
>     f = open(filename)
>     header = f.readline()
>     with f:
>         # use f
> 
> The open doesn't "create a future need to call __exit__". It *does*
> require that the returned object gets closed at some stage, but you
> can do that manually (for example, if "header" in the above is "do not
> process", maybe you'd close and return early). 

sure, but "need to call close" is just a different spelling of "need to call 
__exit__".

> Maybe I should ask the question the other way round. If we had
> opened(), but not open(), how would you write open() using opened()?
> It is, after all, easy enough to write opened() in terms of open().

I would say open() is arguably a wart. Had context managers existed in the 
language all along, it should not be possible to do anything that creates an 
open-ended future requirement to do something (i.e. "require that the returned 
object gets closed at some stage") without either using a with statement or 
writing code to manually call __enter__ and __exit__. The likely most common 
case being a class that holds an open file, which should really have its own 
context manager that forwards to the file's.

to that end, open() could look something like this:

def open(*a,**k):
   cm = opened(*a, **k)
   f = cm.__enter__()
   f.close = cm.__exit__
   return f
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/D4RFZSPZRVS6X2HEDDD3WLOEQIFHMTHL/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to