您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python中** kwargs参数的可变性

Python中** kwargs参数的可变性

让我们来看看:

import dis
dis.dis(lambda: print_arg(**{'key': 'value'}))



  6           0 LOAD_GLOBAL              0 (print_arg)
              3 BUILD_MAP                1
              6 LOAD_CONST               1 ('value')
              9 LOAD_CONST               2 ('key')
             12 STORE_MAP           
             13 CALL_FUNCTION_KW         0
             16 RETURN_VALUE

让我们找出CALL_FUNCTION_KWceval.c)的作用:

    case CALL_FUNCTION_VAR:
    case CALL_FUNCTION_KW:
    case CALL_FUNCTION_VAR_KW:
    {

        // ...

        x = ext_do_call(func, &sp, flags, na, nk);

        // ...



static PyObject *
ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
{
    int nstar = 0;
    PyObject *callargs = NULL;
    PyObject *stararg = NULL;
    PyObject *kwdict = NULL;
    PyObject *result = NULL;

    if (flags & CALL_FLAG_KW) {                     // if ** is involved
        kwdict = EXT_POP(*pp_stack);        // get the dict passed with **      
        if (!PyDict_Check(kwdict)) {
            PyObject *d; 
            d = PyDict_New();                       // make a NEW dict
            if (d == NULL)
                goto ext_call_fail;
            if (PyDict_Update(d, kwdict) != 0) {    // update it with old
                // .. fail ..
                goto ext_call_fail;
            }
            Py_DECREF(kwdict);   
            kwdict = d;              // kwdict is Now the new dict
        }
    }

    ....  
    result = PyObject_Call(func, callargs, kwdict);  // call with new dict
python 2022/1/1 18:44:14 有356人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶