Estoy escribiendo una función C que toma un Python tuple de ints como argumento.

static PyObject* lcs(PyObject* self, PyObject *args) {
    int *data;
    if (!PyArg_ParseTuple(args, "(iii)", &data)) {
        ....
    }
}

Puedo convertir una tupla de una longitud fija (aquí 3) pero ¿cómo obtener una C array de una tuple de cualquier longitud?

import lcs
lcs.lcs((1,2,3,4,5,6)) #<- C should receive it as {1,2,3,4,5,6}

EDITAR

En lugar de una tupla, puedo pasar una cadena con números separados por ';'. Por ejemplo, '1; 2; 3; 4; 5; 6' y sepárelos a la matriz en código C. Pero no creo que sea una forma adecuada de hacerlo.

static PyObject* lcs(PyObject* self, PyObject *args) {
    char *data;
    if (!PyArg_ParseTuple(args, "s", &data)) {
        ....
    }
    int *idata;
    //get ints from data(string) and place them in idata(array of ints)
}

EDITAR (SOLUCIÓN)

Creo que he encontrado una solución:

static PyObject* lcs(PyObject* self, PyObject *args) {
    PyObject *py_tuple;
    int len;
    int *c_array;
    if (!PyArg_ParseTuple(args, "O", &py_tuple)) {
      return NULL;
    }
    len = PyTuple_Size(py_tuple);
    c_array= malloc(len*4);
    while (len--) {
        c_array[len] = (int) PyInt_AsLong(PyTuple_GetItem(py_tuple, len));
   //c_array is our array of ints :)
    }
7
Piotr Dabkowski 28 ago. 2014 a las 19:13

2 respuestas

La mejor respuesta

Utilice PyArg_VaParse: https://docs.python.org/2/c -api / arg.html # PyArg_VaParse Funciona con va_list, donde puede recuperar un número variable de argumentos.

Más información aquí: http://www.cplusplus.com/reference/cstdarg/va_list/

Y como es una tupla, puede usar las funciones de tupla: https: // docs. python.org/2/c-api/tuple.html como PyTuple_Size y PyTuple_GetItem

Aquí hay un ejemplo de cómo usarlo: Módulo de extensión de Python con número variable de argumentos

Avísame si te ayuda.

3
Community 23 may. 2017 a las 12:09

No estoy seguro de si esto es lo que estás buscando, pero podría escribir una función C que tome un número variable de argumentos, usando va_list y va_start. Un tutorial está aquí: http://www.cprogramming.com/tutorial/c/lesson17. html

0
jj3pa 28 ago. 2014 a las 15:22