Ошибка TypeError при вызове метода set_params() объекта CatBoost из Си

Имитирую на си код python

model = cb.CatBoostClassifier()


model.set_params(
  class_names=('<=50K', '>50K'),
  loss_function='Logloss',
  eval_metric='AUC',
  custom_metric=['AUC'],
  iterations=100,
  random_seed=20181224,
  learning_rate=0.4234185321620083,
  depth=5,
  l2_leaf_reg=9.464266235679002)

model.fit(indata, Y, cat_features = cat_new)

аналогичный на Си: Полный код тут

    PyObject *dict = Py_BuildValue("{s:i,s:s,s:i,s:f,s:i,s:f,s:s}", "iterations", 100, "loss_function", "Logloss", "random_seed",43 ,
        "learning_rate", 0.4234185321620083,  "depth", 5, "l2_leaf_reg", 9.464266235679002 , "eval_metric","AUC");

PyObject *name = Py_BuildValue("s","set_params");
pVal = PyObject_CallMethodObjArgs(pInstance, name, dict);


if (pVal == NULL){
    printf("pval is NULL\n");

    PyErr_Print();
} else {
    Py_DECREF(pVal);
}

Получаю ошибку:

TypeError: CatBoost.set_params() takes 1 positional argument but 9 were given

Ответы (1 шт):

Автор решения: user1514692

Тут не подходит вызов PyObject_CallMethodObjArgs(...) надо искать другой метод вызова.

Вызов:

pVal = PyObject_CallMethodObjArgs(pInstance, name, dict);

# должен быть таким, тогда ошибки не будет, но это не правильно
# это эквивалентно вызову model.set_params( dict ), 
# а все-таки хотелось добиться вызова model.set_params( parm1, parm2, ..., parnN ), 
pVal = PyObject_CallMethodObjArgs(pInstance, name, dict, NULL);
→ Ссылка