Wenn Sie eine C-Funktion zum Akzeptieren von Gleitkommazahlen deklarieren, wird sich der Compiler nicht beschweren, wenn Sie ihm einen int übergeben. Zum Beispiel erzeugt das Programm die Antwort 2.000000:
#include <stdio.h>
float f(float x) {
return x+1;
}
int main() {
int i=1;
printf ("%f", f(i));
}
eine Python-Modul-Version, iorf.c:
#include <Python.h>
static PyObject *IorFError;
float f(float x) {
return x+1;
}
static PyObject *
fwrap(PyObject *self, PyObject *args) {
float in=0.0;
if (!PyArg_ParseTuple(args, "f", &in))
return NULL;
return Py_BuildValue("f", f(in));
}
static PyMethodDef IorFMethods[] = {
{"fup", fwrap, METH_VARARGS,
"Arg + 1"},
{NULL, NULL, 0, NULL} /* Sentinel */
};
PyMODINIT_FUNC
initiorf(void)
{
PyObject *m;
m = Py_InitModule("iorf", IorFMethods);
if (m == NULL)
return;
IorFError = PyErr_NewException("iorf.error", NULL, NULL);
Py_INCREF(IorFError);
PyModule_AddObject(m, "error", IorFError);
}
Die setup.py:
from distutils.core import setup, Extension
module1 = Extension('iorf',
sources = ['iorf.c'])
setup (name = 'iorf',
version = '0.1',
description = 'This is a test package',
ext_modules = [module1])
Ein Beispiel:
03:21 $ python
Python 2.7.10 (default, Jul 30 2016, 18:31:42)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import iorf
>>> print iorf.fup(2)
3.0
>>> print iorf.fup(2.5)
3.5
Hinweis: Ich habe Ihre Frage bearbeitet, um das Lesen zu erleichtern. Wenn du etwas nicht magst, das ich geändert habe, dann kannst du es gerne ändern, weil es deine Frage ist, nicht meine. – immibis
Sie möchten wahrscheinlich mit 'PyObject' arbeiten und dann das [Number Protocol] (https://docs.python.org/2/c-api/number.html) verwenden, um mit den Zahlen zu arbeiten. Wenn Sie zum Beispiel auf einen 'float' zwingen wollen, können Sie' PyNumber_Float' auf Ihrem 'PyObject' aufrufen. – mgilson