Eldorad O. Ответов: 1

Как дать имя функции, аргументы в C-API-интерфейс?


Привет.
Я пытаюсь решить эту проблему, но все еще в pycharm, когда я смотрю на свой аргумент функции
имя я вижу только "*args" и "**kwargs", несмотря на "labels_list", который я установил при определении своей функции в
С++.
Я могу передать аргумент с ключевым словом "labels_list" или без него, но я не вижу этого имени аргумента
в списке аргументов функции в PyCharm.

Вот мой код:

static PyObject* encode_one_hot(PyObject* self, PyObject* args, PyObject* kwargs) {
 
    PyArrayObject* labels = NULL;
    PyArrayObject* one_hot;
 
    npy_intp dims[2];
 
    map<int, int> classes_map;
 
    int current_label;
    int labels_size;
 
    int new_numeration = 0;
 
    void* ptr;
 
    static char* kwlist[] = { (char*)"labels_list", NULL };
 
    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", kwlist, &labels))
        return NULL;
 
 
    PyArray_Sort(labels, 0, NPY_QUICKSORT);
 
    labels_size = PyArray_SIZE(labels);
 
    for (int i = 0; i < labels_size; i++) {
        ptr = PyArray_GETPTR1(labels, i);
        current_label = PyLong_AsLong(PyArray_GETITEM(labels, ptr));
 
        if (classes_map.find(current_label) == classes_map.end()) {
            classes_map[current_label] = new_numeration;
            new_numeration++;
        }
    }
 
    dims[0] = labels_size;
    dims[1] = (int)classes_map.size();
 
    one_hot = (PyArrayObject*)PyArray_ZEROS(2, dims, NPY_INT, 0);
 
    for (int i = 0; i < labels_size; i++) {
        current_label = classes_map[PyLong_AsLong(PyArray_GETITEM(labels, PyArray_GETPTR1(labels, i)))];
        ptr = PyArray_GETPTR2(one_hot, i, current_label);
 
        PyArray_SETITEM(one_hot, ptr, PyLong_FromLong(1));
    }
     
    return PyArray_Return(one_hot);
}

Буду очень благодарен за помощь :)

Что я уже пробовал:

Я пытался найти в google любой ответ и прочитать документацию.

1 Ответов

Рейтинг:
1

OriginalGriff

Имена переменных вне функции не передаются функции в C или C++ - все, что передается, - это содержимое.
В вашем случае передается указатель - адрес памяти - и у него нет имени.
Хуже того, если вызывающая функция хранит данные в локальной переменной, вполне вероятно, что у нее никогда не было имени после компиляции приложения, так как многие оптимизаторы будут использовать машинные регистры вместо того, чтобы хранить что-либо в памяти.


Eldorad O.

Итак, как я могу назвать свои параметры функции C в Python?
Я думал о чем-то вроде этого:

from module_with_function_written_in_C import encode_one_hot


def encode_one_hot_python(labels_list):
    return encode_one_hot(labels_list)


Но для меня это выглядит некрасиво :/

OriginalGriff

Просто назовите их так же, как в коде C:
self, args, и kwargs
Таким образом, они "связываются" с именами в коде C, и вы можете видеть, что они должны делать / быть.

Eldorad O.

Позвольте мне показать вам, что я имею в виду, может быть, я не совсем точно описываю свою проблему ;d

Экран:

https://imgur.com/a/tE1mY0Z

Я хочу, чтобы "labels_list" появлялся вместо имен аргументов, несмотря на "*args, **kwargs".

OriginalGriff

Вы не можете: код C требует трех различных параметров, а не одной коллекции.