@@ -665,6 +665,20 @@ func_get_type_params(PyFunctionObject *op, void *Py_UNUSED(ignored))
665665 return Py_NewRef (op -> func_typeparams );
666666}
667667
668+ static int
669+ func_set_type_params (PyFunctionObject * op , PyObject * value , void * Py_UNUSED (ignored ))
670+ {
671+ /* Not legal to del f.__type_params__ or to set it to anything
672+ * other than a tuple object. */
673+ if (value == NULL || !PyTuple_Check (value )) {
674+ PyErr_SetString (PyExc_TypeError ,
675+ "__type_params__ must be set to a tuple" );
676+ return -1 ;
677+ }
678+ Py_XSETREF (op -> func_typeparams , Py_NewRef (value ));
679+ return 0 ;
680+ }
681+
668682PyObject *
669683_Py_set_function_type_params (PyThreadState * Py_UNUSED (ignored ), PyObject * func ,
670684 PyObject * type_params )
@@ -687,7 +701,8 @@ static PyGetSetDef func_getsetlist[] = {
687701 {"__dict__" , PyObject_GenericGetDict , PyObject_GenericSetDict },
688702 {"__name__" , (getter )func_get_name , (setter )func_set_name },
689703 {"__qualname__" , (getter )func_get_qualname , (setter )func_set_qualname },
690- {"__type_params__" , (getter )func_get_type_params , NULL },
704+ {"__type_params__" , (getter )func_get_type_params ,
705+ (setter )func_set_type_params },
691706 {NULL } /* Sentinel */
692707};
693708
0 commit comments