2016-06-14 9 views
1

Ich möchte eine c-Erweiterung mit einer Funktion schreiben, die ihr Argument ändert. Ist das möglich?Eine Python-C-Erweiterung schreiben, die das Argument ändert

HelloWorld.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'])]) 

Installation:

python setup.py install 

Test:

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)) 

Testergebnis:

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

Die Integer- und Doppelwerte werden nicht geändert. Das Ergebnis sollte "nach: 4, 16.0, asdf"

Vielen Dank für die Hilfe.

+2

'int's und' float's sind unveränderlich in Python. Also nein, sie können nicht geändert werden, Punkt. – Kundor

+0

Ich suchte online und fand das ganz richtig. Ist es möglich, einen Zeiger auf die int/flow-Variable in die Funktion zu übergeben? Auf diese Weise kann die Funktion den Wert erhalten und ändern, auf den der Zeiger zeigt? Oder kann das (stackoverflow.com/questions/8056130/immutable-vs-mutable-types) funktionieren? – rxu

+0

Nein. Der Wert kann nicht geändert werden. In Python gibt es ein einzelnes int-Objekt mit dem Wert 3. Wenn Sie eine Operation ausführen, die zu 3 führt, wird dieses Objekt zurückgegeben. Wenn Sie es irgendwie geschafft haben, auf den Speicherort zuzugreifen und seinen Inhalt auf, sagen wir, 4 zu ändern, dann wäre 1 + 2 überall 4. Das wäre schlecht. – Kundor

Antwort

2

Ich möchte eine c-Erweiterung mit einer Funktion schreiben, die ihr Argument ändert. Ist das möglich?

Nur in dem Maße, wie es mit einer gewöhnlichen Funktion möglich ist. Sie können die an Sie übergebenen Objekte mutieren, wenn sie veränderbar sind, aber Sie können keine Variablen neu zuweisen, die verwendet werden, um Ihnen diese Objekte zu übergeben. Die C-API lässt dich das nicht umgehen.

Die Funktion, die Sie schreiben möchten, funktioniert nicht.

+0

Danke für den Zeiger. Wie schreibe ich eine c-Erweiterung, die die an die Funktion übergebenen Objekte mutiert? Wie ein Int-Objekt nehmen und dann das Objekt mutieren? – rxu

+0

@rxu: Python-Ints sind nicht änderbar. – user2357112