On Tue, Feb 04, 2003 at 11:58:15AM -0000, Moore, Paul wrote: > I'm rapidly tending towards a preference for extreme simplicity in the with > statement. My basic logic is that the C++ idiom for all this is pretty > minimal, and works well (even though C++ has no "finally" equivalent, so the > need is more pressing in C++). > > So, my current feeling is: > > 'with' expr ':' > suite > > expands to > > _x = expr > if hasattr(_x, '__enter__'): > _x.__enter__() > try: > suite > finally: > if hasattr(_x, '__exit__'): > _x.__exit__() Hmmm, __enter__ and __exit__ still look suspiciously like __init__ and __del__ to me. If the problem is that __del__ is not guaranteed to be called if there are remaining references to the object (or in a GC based system like Jython) why not address this issue directly? Let's assume that a new 'local' statement is added to Python. At the end of the current block the __del__ method of any references declared local is guaranteed to be called. The object must have exactly one remaining reference, otherwise an exception is raised. In a GC implementation it may make some change to the object so that any remaining references to it become stale references and raise an exception as soon as they are touched in any way. Note that a reference to a closed file object is already a stale reference and raises an exception if any I/O operation is attempted on it. So autoclose just becomes: local f = open(...) Automatic reference counting and garbage collection is great most of the time but more explicit control of the intended lifetime of an object can sometimes be useful. Oren
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4