At 11:03 PM 5/17/2005 +1000, Nick Coghlan wrote: >Do you mean translating this: > > with EXPR1 as VAR1: > BLOCK1 > >To something along the lines of: > > the_stmt = EXPR1 > stmt_enter = getattr(the_stmt, "__enter__", None) > stmt_exit = getattr(the_stmt, "__exit__", None) > > if stmt_enter is None: > VAR1 = the_stmt > else: > VAR1 = stmt_enter() > > if stmt_exit is None: > BLOCK1 > else: > exc = (None, None, None) > try: > try: > BLOCK1 > except: > exc = sys.exc_info() > raise > finally: > stmt_exit(*exc)
Essentially, yes; although I was actually suggesting that there be PyResource_Enter() and PyResource_Exit() C APIs that would supply the default behaviors if the tp_resource_enter and tp_resource_exit slots were missing from the object's type. But that's an implementation detail. >It has a certain elegance - you can switch from using an object that needs >finalisation to one that doesn't without having to change your code. > >And library code can safely ensure finalisation without having to check >whether >the object needs it or not - that check becomes an inherent part of the with >statement. Precisely. _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com