Tutorialは.pyx
が.pxd
ファイルからの定義の実現でない限り.pyx
と.pxd
ファイルが同じ名前を持つべきではないと言います。Cython:カウンターチュートリアル行動
両方が が同じコードを記述しないよう.pyxファイルの名前は、Cライブラリからの宣言と cqueue.pxdのファイルとは異なるされている必要があります。 という名前の.pyxファイルの横にある.pxdファイルは、.pyxファイルのコードのエクスポート宣言を定義します。 cqueue.pxdファイルには通常のCライブラリの宣言が含まれているため、 は、Cythonが と関連付けているのと同じ名前の.pyxファイルであってはなりません。
それは同じ名前が.pxd
が.pyx
コードとは無関係なcdef extern
CPP宣言であっても、これらの二つのファイルに与えられている場合にのみ、正常に動作するときしかし、私は、状況に遭遇しました。
py_test.pyx:
# distutils: language = c++
from py_test cimport Test
def f():
Test[double](2.) + 3.
zzz.pyx:
# distutils: language = c++
from py_test cimport Test
def f():
Test[double](2.) + 3.
py_test.pxd:
cdef extern from "cpp_test.h":
cdef cppclass Test[T]:
Test()
Test(T value)
T value
cdef Test[T] operator+[T](Test[T]&, T)
cpp_test.h:
template<typename T>
class Test {
public:
T value;
Test():value(0){}
Test(T value):value(value){}
~Test(){}
};
template<typename T>
Test<T> operator+(const Test<T>& x, T y) {
return Test<T>(x.value + y);
}
setup.py:
from distutils.core import setup
from Cython.Build import cythonize
setup(
name = "demo", # unused
# ext_modules = cythonize('py_test.pyx'), # ok
ext_modules = cythonize('zzz.pyx'), # Invalid operand types for '+' (Test[double]; double)
)
ありがとう、それは私が必要としていたものです!私は 'operator +'をcimportingする別の方法を知っています(私の答えは以下を参照してください)。 – axil