On Wed, Jan 23, 2019 at 9:23 AM Paul Ferrell <[email protected]> wrote:
>
> That is definitely an ambiguity worth considering (whether __enter__ is
> within the implied 'try').
>
It's not even __enter__.
>>> import dis
>>> def f(path):
... with open(path) as f:
... print("Got f:", f)
...
>>> dis.dis(f)
2 0 LOAD_GLOBAL 0 (open)
2 LOAD_FAST 0 (path)
4 CALL_FUNCTION 1
6 SETUP_WITH 16 (to 24)
8 STORE_FAST 1 (f)
3 10 LOAD_GLOBAL 1 (print)
12 LOAD_CONST 1 ('Got f:')
14 LOAD_FAST 1 (f)
16 CALL_FUNCTION 2
18 POP_TOP
20 POP_BLOCK
22 BEGIN_FINALLY
>> 24 WITH_CLEANUP_START
26 WITH_CLEANUP_FINISH
28 END_FINALLY
30 LOAD_CONST 0 (None)
32 RETURN_VALUE
>>>
At the time when "open(path)" is called, the 'with' block hasn't begun
operating yet. The SETUP_WITH operation will call __enter__, but prior
to that, we have to have an object to use as the context manager. Any
exception thrown by opening the file will happen before __enter__ gets
called. AIUI the __enter__ method of file objects doesn't actually do
anything much (just validates that it's still open).
ChrisA
_______________________________________________
Python-ideas mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/