Написание расширения python c, которое изменяет аргумент

Я хочу написать расширение c с функцией, которая изменяет свой аргумент. Это возможно?

привет мир.с

#include <Python.h>
// adapted from http://www.tutorialspoint.com/python/python_further_extensions.htm


/***************\
* Argument Test *
\***************/
// Documentation string
static char arg_test_docs[] =
    "arg_test(integer i, double d, string s): i = i*i; d = i*d;\n";

// C Function
static PyObject * arg_test(PyObject *self, PyObject *args){
    int i;
    double d;
    char *s;
    if (!PyArg_ParseTuple(args, "ids", &i, &d, &s)){
        return NULL;
    }
    i = i * i;
    d = d * d;
    Py_RETURN_NONE;
}

// Method Mapping Table
static PyMethodDef arg_test_funcs[] = {
    {"func", (PyCFunction)arg_test,  METH_NOARGS , NULL },
    {"func", (PyCFunction)arg_test,  METH_VARARGS, NULL},
    {NULL, NULL, 0, NULL}
};

void inithelloworld(void)
{
    Py_InitModule3("helloworld", arg_test_funcs,
                   "Extension module example3!");
}

setup.py

from distutils.core import setup, Extension
setup(name='helloworld', version='1.0',  \
      ext_modules=[Extension('helloworld', ['helloworld.c'])])

Монтаж:

python setup.py install

Тест:

import helloworld
i = 2; d = 4.0; s='asdf'
print("before: %s, %s, %s" % (i,d,s))
helloworld.func(i,d,s)
print("after: %s, %s, %s" % (i,d,s))

Результат испытаний:

before: 2, 4.0, asdf
after: 2, 4.0, asdf

Целочисленные и двойные значения не изменяются. Результат должен быть "после: 4, 16.0, asdf"

Спасибо за помощь.


person rxu    schedule 14.06.2016    source источник
comment
ints и floats неизменяемы в Python. Так что нет, их нельзя изменить, и точка.   -  person Nick Matteo    schedule 15.06.2016
comment
Я искал в Интернете и нашел, что это совершенно верно. можно ли передать указатель на переменную int/flow в функцию? Таким образом, может ли функция получить и изменить значение, на которое указывает указатель? Или это ( stackoverflow.com/questions/8056130/immutable-vs-mutable-types ) может работать?   -  person rxu    schedule 15.06.2016
comment
Нет. Значение не может быть изменено. В Python существует единственный объект int со значением 3. Если вы выполняете любую операцию, результатом которой является 3, возвращается этот объект. Если каким-то образом вам удалось получить доступ к ячейке памяти и изменить ее содержимое, скажем, на 4, то 1+2 будет везде равно 4. Это было бы плохо.   -  person Nick Matteo    schedule 15.06.2016


Ответы (1)


Я хочу написать расширение c с функцией, которая изменяет свой аргумент. Это возможно?

Только в той мере, в какой это возможно с обычной функцией. Вы можете изменить переданные вам объекты, если они изменяемы, но вы не можете переназначить какие-либо переменные, используемые для передачи вам этих объектов. C API не позволяет обойти это.

Функция, которую вы хотите написать, не будет работать.

person user2357112 supports Monica    schedule 14.06.2016
comment
Спасибо за указатель. Как написать расширение c, которое изменяет объекты, переданные функции? Например, взять объект int, а затем изменить объект? - person rxu; 15.06.2016
comment
@rxu: целые числа Python не изменяются. - person user2357112 supports Monica; 15.06.2016