Are the CALL_FUNCTION_* opcodes ever used?

Peter Otten __peter__ at web.de
Thu Sep 21 18:36:08 EDT 2006


Fabiano Sidler wrote:

> Studying python byte code I encountered an interesting issue: there is no
> matter, which one of the following function calls I compile:
> 
> 1: func('foo','bar',foo='bar')
> 2: func('foobar')
> 3: func(foo='bar')
> 
> The compiler always uses the simple CALL_FUNCTION for all of the source
> examples above. While this is fine for me (since the labels in
> Python/ceval.c for the other 3 opcodes lead to the same code anyway), I'm
> curious to know if there is a case where the compiler really uses the
> CALL_FUNCTION_* opcodes or if we could silently remove these opcodes
> without breaking anything?

>>> def test():
...     func(*args)
...     func(**kw)
...     func(*args, **kw)
...
>>> dis.dis(test)
  2           0 LOAD_GLOBAL              0 (func)
              3 LOAD_GLOBAL              1 (args)
              6 CALL_FUNCTION_VAR        0
              9 POP_TOP

  3          10 LOAD_GLOBAL              0 (func)
             13 LOAD_GLOBAL              2 (kw)
             16 CALL_FUNCTION_KW         0
             19 POP_TOP

  4          20 LOAD_GLOBAL              0 (func)
             23 LOAD_GLOBAL              1 (args)
             26 LOAD_GLOBAL              2 (kw)
             29 CALL_FUNCTION_VAR_KW     0
             32 POP_TOP
             33 LOAD_CONST               0 (None)
             36 RETURN_VALUE

So there.

Peter



More information about the Python-list mailing list