About MAKE_FUNCTION opcode in Python 3
Eric Snow
ericsnowcurrently at gmail.com
Tue Sep 20 17:56:41 EDT 2011
On Tue, Sep 20, 2011 at 1:59 PM, Arnaud Delobelle <arnodel at gmail.com> wrote:
> Since Python 3.0 we have keyword only arguments in functions (see PEP
> 3102). Looking at the documentation for the dis module (where opcodes
> are documented), I see the following for MAKE_FUNCTION [1]
>
> """
> MAKE_FUNCTION(argc)
> Pushes a new function object on the stack. TOS is the code associated
> with the function. The function object is defined to have argc default
> parameters, which are found below TOS.
> """
>
> No mention of default values for keyword only arguments. Now let's
> try (Python 3.2):
>
>>>> def foo():
> ... def bar(x, y, *args, z=1, t=2, **kwargs): pass
> ...
>>>> dis.dis(foo)
> 2 0 LOAD_CONST 1 ('z')
> 3 LOAD_CONST 2 (1)
> 6 LOAD_CONST 3 ('t')
> 9 LOAD_CONST 4 (2)
> 12 LOAD_CONST 5 (<code object bar at
> 0x1005ec8b0, file "<stdin>", line 2>)
> 15 MAKE_FUNCTION 512
> 18 STORE_FAST 0 (bar)
> 21 LOAD_CONST 0 (None)
> 24 RETURN_VALUE
>
> MAKE_FUNCTION has an argc of 512. So it seems that since Python 3.0:
>
> * the number of default values for normal arguments is argc & 0xFF
> * the number of default values for keyword only arguments is argc >> 8
>
> Can anyone confirm this? I can then open a ticket on bugs.python.org
You're mostly right.
http://hg.python.org/cpython/file/default/Python/ceval.c#l2684
2684 int posdefaults = oparg & 0xff;
2685 int kwdefaults = (oparg>>8) & 0xff;
2686 int num_annotations = (oparg >> 16) & 0x7fff;
-eric
>
> [1] http://docs.python.org/dev/library/dis.html#opcode-MAKE_FUNCTION
>
> --
> Arnaud
> --
> http://mail.python.org/mailman/listinfo/python-list
>
More information about the Python-list
mailing list