[Python-3000] Betas today - I hope

Nick Coghlan ncoghlan at gmail.com
Fri Jun 13 10:56:01 CEST 2008


Georg Brandl wrote:
> Nick Coghlan schrieb:
> 
>> 2. Method lookup MAY bypass __getattribute__, shadowing the attribute 
>> in the instance dictionary MAY have ill effects. (slots such as 
>> __enter__ and __exit__ that are looked up via normal attribute lookup 
>> in CPython will fit into this category)
> 
> I would argue that the __enter__ and __exit__ behavior should be changed 
> too.
> The reason for the current behavior is this:
> 
>   2           0 LOAD_GLOBAL              0 (a)
>               3 DUP_TOP
>               4 LOAD_ATTR                1 (__exit__)
>               7 STORE_FAST               0 (_[1])
>              10 LOAD_ATTR                2 (__enter__)
>              13 CALL_FUNCTION            0
>              16 STORE_FAST               1 (_[2])
>              19 SETUP_FINALLY           18 (to 40)
> 
> IOW, when "with" is compiled, the attributes are retrieved using bytecode.
> It wouldn't be hard to have a WITH_SETUP opcode (along with the already
> existing WITH_CLEANUP) that would make the bytecode read like:
> 
>   2           0 LOAD_GLOBAL              0 (a)
>               3 WITH_SETUP               0 (_[1])
>               6 STORE_FAST               1 (_[2])
>               9 SETUP_FINALLY           18 (to 40)

No argument here - the PEP 343 implementation is the way it is mainly 
because it involved the least messing around with the 
performance-sensitive ceval loop.

That said, the with statement implementation is already a bit different 
in 2.6/3.0 (it moves things around on the stack so it can avoid the 
STORE_FAST/LOAD_FAST/DELETE_FAST operations):

def f():
   with a:
     pass

Python 2.5 disassembly:
  2           0 LOAD_GLOBAL              0 (a)
               3 DUP_TOP
               4 LOAD_ATTR                1 (__exit__)
               7 STORE_FAST               0 (_[1])
              10 LOAD_ATTR                2 (__enter__)
              13 CALL_FUNCTION            0
              16 POP_TOP
              17 SETUP_FINALLY            4 (to 24)
              20 POP_BLOCK
              21 LOAD_CONST               0 (None)
         >>   24 LOAD_FAST                0 (_[1])
              27 DELETE_FAST              0 (_[1])
              30 WITH_CLEANUP
              31 END_FINALLY

Python 2.6 disassembly:
   2           0 LOAD_GLOBAL              0 (a)
               3 DUP_TOP
               4 LOAD_ATTR                1 (__exit__)
               7 ROT_TWO
               8 LOAD_ATTR                2 (__enter__)
              11 CALL_FUNCTION            0
              14 POP_TOP
              15 SETUP_FINALLY            4 (to 22)
              18 POP_BLOCK
              19 LOAD_CONST               0 (None)
         >>   22 WITH_CLEANUP
              23 END_FINALLY

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia
---------------------------------------------------------------
             http://www.boredomandlaziness.org


More information about the Python-3000 mailing list