About MAKE_FUNCTION opcode in Python 3

Terry Reedy tjreedy at udel.edu
Tue Sep 20 23:09:30 EDT 2011


On 9/20/2011 5:56 PM, Eric Snow wrote:
> 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;

>> [1] http://docs.python.org/dev/library/dis.html#opcode-MAKE_FUNCTION

I agree that doc should be updated for 3.x. Please suggest a new working 
if you can, as well as copying the source snippet above. Add me 
terry.reedy as nosy.

-- 
Terry Jan Reedy




More information about the Python-list mailing list