Нужна помощь для понимания Cython - найти пример, но не работает - PullRequest
0 голосов
/ 14 апреля 2019

У меня проблема с пониманием Cython и pxd.Я нашел этот код в Интернете, но не работает.Не могли бы вы объяснить, почему?

Ошибка при компиляции:

предупреждение: test.pyx: 1: 0: переопределение метода cdef с помощью метода def.

test.pxd: 6: 14: метод C 'foo' объявлен, но не определен

Я нашел этот пример здесь: https://cython.readthedocs.io/en/latest/src/tutorial/pure.html

Я сделал ошибку в компиляции?

compile.py:

import os
import sysconfig

from distutils.core import setup
from Cython.Build import cythonize

fichier = "test.pyx"

setup(
    ext_modules = cythonize(fichier)
)

test.pyx:

def myfunction(x, y=2):
    a = x - y
    return a + x * y

def _helper(a):
    return a + 1

class A:
    def __init__(self, b=0):
        self.a = 3
        self.b = b

    def foo(self, x):
        print(x + _helper(1.0))

test.pxd:

cpdef int myfunction(int x, int y=*)
cdef double _helper(double a)

cdef class A:
    cdef public int a, b
    cpdef foo(self, double x)

1 Ответ

1 голос
/ 14 апреля 2019

Это связано с именем файла.Файлы .pyx рассматриваются как файлы Cython (т.е. они должны соответствовать файлам .pxd).Однако .py файлы интерпретируются как «чистый режим Python» (поскольку они также должны работать в Python).

Если вы переименуете свой .pyx файл в .py, он будет работать.


Это довольно четко указано в документации, на которую вы ссылаетесь:

Хотя объявления в файле .pyx должны точно соответствовать объявлениям в файле .pxd с тем же именем (и любымПротиворечие приводит к ошибке времени компиляции, см. файлы pxd), нетипизированные определения в файле .py могут быть переопределены и дополнены статическими типами с помощью более конкретных, присутствующих в .pxd

...