En Sun, 18 Mar 2007 10:21:27 -0300, Dustan <[EMAIL PROTECTED]> escribió:
>>>> dis.dis(testPrivateStaticFunctionVariables) > 21 0 LOAD_DEREF 0 (func) > 3 LOAD_DEREF 1 (internalData) > 6 LOAD_FAST 0 (args) > 9 CALL_FUNCTION_VAR 1 > 12 RETURN_VALUE > > What's the difference between 'LOAD_DEREF', 'LOAD_FAST', and > 'LOAD_CONST', and, as seen at http://docs.python.org/lib/module-dis.html, > 'LOAD_GLOBAL'? I can imagine that 'LOAD_GLOBAL' loads a global, but > seeing as python is such a dynamic language, how exactly is it > supposed to distinguish between them? The Python interpreter executes a stack-based machine. Look at Python/compile.c for the code generation and Python/ceval.c for the code execution. LOAD_CONST pushes a constant onto the stack (all constants are previously built and stored as attribute co_consts of the code object). LOAD_FAST and LOAD_GLOBAL pushes a local or global variable reference. (The compiler knows whether a name is local or not, just by lexical analysis). LOAD_DEREF appears to be used for accessing variables inside closures, I'm not sure. > I don't understand the following at all: 'DUP_TOP', 'ROT_TWO'. Any > pointers? They manipulate the stack. DUP_TOP duplicates the top entry; ROT_TWO swaps the two top entries. > What does 'INPLACE_ADD' mean, if not in place addition, and if it is > in place addition, why does it need to 'STORE_ATTR' afterward? That corresponds to A += B. The compiler can't know if A has or not an __iadd__ method; even if A implements __iadd__, that method could return a different object, not always A (it *may* try to do the operation inplace, but that might not always be possible). When the inplace method is not implemented, __add__ is used (so effectively A += B is computed as A = A+B) -- Gabriel Genellina -- http://mail.python.org/mailman/listinfo/python-list