Snažím sa reprodukovať niekoľko príkladov z tutoriálu pre Cython, aby som sa naučil Cython:
http://docs.cython.org/en/latest/src/tutorial/external.html
Myslím si, že dve nasledujúce varovania spolu nesúvisia. Preto dve otázky:
(1)
Pomocou tohto ako vstupu do
python setup.py build_ext --inplace -c mingw32
from libc.math cimport sin
cdef extern from "math.h":
cdef double sin(double x)
cpdef double f(double x):
return sin(x*x)
cpdef test(double x):
return f(x)
Dostávam:
D:pythoncython>python setup.py build_ext --inplace -c mingw32
Compiling primes.pyx because it changed.
[1/1] Cythonizing primes.pyx
warning: primes.pyx:4:19: Function signature does not match previous declaration
running build_ext
building "primes" extension
C:MinGWbingcc.exe -mdll -O -Wall -IC:Python34include -IC:Python34include -c primes.c -o buildtemp.win32-3.4Releaseprimes.o
writing buildtemp.win32-3.4Releaseprimes.def
C:MinGWbingcc.exe -shared -s buildtemp.win32-3.4Releaseprimes.o buildtemp.win32-3.4Releaseprimes.def -LC:Python34libs -LC:Python34PCbuild -lpython34 -lmsvcr100 -o D:pythoncythonprimes.pyd
D:pythoncython>
Prečo je varovanie „Funkčný podpis sa nezhoduje s predchádzajúcou deklaráciou“?
(2)
Keď sa prihlásim
cdef extern from "math.h":
cpdef double sin(double x)
Dostávam ďalšie varovanie
warning: primes.pyx:4:20: Function "sin" previously declared as "cpdef"
Je však uvedený presne rovnakým spôsobom akopríklad v kapitole „Externé vyhlásenia“ odkazovanej stránky. V module pythonu, do ktorého sa modul importuje, nie je v balíku známe sin. Kde je problém?
Popis v tejto príručke je:
Note that you can easily export an external C function from your Cython module by declaring it as cpdef. This generates a Python wrapper for it and adds it to the module dict.
odpovede:
1 pre odpoveď č. 1rôzne časti tutoriálu rozdielny spôsoby volania funkcií C.
Pre niektoré funkcie, pre ktoré je to Cython .pxd
hlavička je poskytnutá, môžete použiť from libc.math import sin
. Pre všetky knižnice môžete použiť dlhšiu metódu .h
hlavička a opätovné prehlásenie.
Nemôžete ich však kombinovať, pretože vytvárajú dve definície tej istej funkcie, aj keď sú identické.