Georg Brandl wrote: > Current trunk: > >>>> with 1: > ... print "1" > ... > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > AttributeError: 'int' object has no attribute '__exit__' > > Isn't that a bit crude? For "for i in 1" there's a better > error message, so why shouldn't the above give a > TypeError: 'int' object is not a context manager
The for loop has a nice error message because it starts with its own opcode, but the with statement translates pretty much to the code in PEP 343. There's a special opcode at the end to help with unwinding the stack, but at the start it's just normal attribute retrieval opcodes for __enter__ and __exit__. >>> def f(): ... with 1: ... pass ... >>> dis.dis(f) 2 0 LOAD_CONST 1 (1) 3 DUP_TOP 4 LOAD_ATTR 0 (__exit__) 7 STORE_FAST 0 (_[1]) 10 LOAD_ATTR 1 (__enter__) 13 CALL_FUNCTION 0 16 POP_TOP 17 SETUP_FINALLY 4 (to 24) 3 20 POP_BLOCK 21 LOAD_CONST 0 (None) >> 24 LOAD_FAST 0 (_[1]) 27 DELETE_FAST 0 (_[1]) 30 WITH_CLEANUP 31 END_FINALLY 32 LOAD_CONST 0 (None) 35 RETURN_VALUE Cheers, Nick. -- Nick Coghlan | [EMAIL PROTECTED] | Brisbane, Australia --------------------------------------------------------------- http://www.boredomandlaziness.org _______________________________________________ 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