Eğer floatları kabul etmek için bir C işlevi bildirirseniz, derleyici bir int iletirseniz şikayet etmez.
#include <stdio.h>
float f(float x) {
return x+1;
}
int main() {
int i=1;
printf ("%f", f(i));
}
Bir piton modülü sürümünü 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);
}
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])
Bir örnek:
Örneğin, bu program cevabı 2,000000 üretir
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
Not: Okumayı kolaylaştırmak için sorunuzu düzenledim. Eğer değiştirdiğim bir şeyden hoşlanmıyorsanız, o zaman onu değiştirmek için çekinmeyin, çünkü bu sizin sorunuz değil. – immibis
Muhtemelen PyObject ile çalışmak ve daha sonra sayılarla çalışmak için [Numara Protokolü] (https://docs.python.org/2/c-api/number.html) kullanmak istiyorsunuz. Örneğin, bir "float" a zorlamak için _need_ 'i kurarsanız, PyObject'inizde 'PyNumber_Float' öğesini çağırabilirsiniz. – mgilson