私はこのURLで例を試しています。 http://cython.readthedocs.io/en/latest/src/userguide/buffer.htmlCythonバッファープロトコルの例エラー
私は以下を実行します。
import pyximport
pyximport.install(build_dir = 'build')
import ctest
m = ctest.Matrix(10)
m.add_row()
print(m)
私は
from cpython cimport Py_buffer
from libcpp.vector cimport vector
cdef class Matrix:
cdef Py_ssize_t ncols
cdef Py_ssize_t shape[2]
cdef Py_ssize_t strides[2]
cdef vector[float] v
def __cinit__(self, Py_ssize_t ncols):
self.ncols = ncols
def add_row(self):
"""Adds a row, initially zero-filled."""
self.v.extend(self.ncols)
...
このエラーとして定義されたクラスadd_rowで TypeError: 'int' object is not iterable
を言ってm.add_row()関数を呼び出すとき、これは私にエラーを与えるが、私に完全な意味がありますPythonのリストを拡張するのとまったく同じことをcythonのベクトル上で行うと仮定します。あなたはそれを数値に渡すのではなく、反復可能なオブジェクトをリストに追加します。
私はこれを行うことによって、それを修正することができます...
def add_row(self):
"""Adds a row, initially zero-filled."""
self.v.extend([0] * self.ncols)
例のか、私が何かをしないのですかのタイプミスがあった場合、私はちょうど思っていました。また、ベクトルの拡張関数はどこから来ますか? cythonと一緒に配布されているvector.pxdファイルでは、拡張関数をインポートすることはありません。それはC++標準ライブラリにも存在しません。 cythonはベクター型で特別なことをしますか?
https://github.com/cython/cython/blob/master/Cython/Includes/libcpp/vector.pxd
リストがベクトルに変換されないので、ベクトルが拡張されることはありません。 – DavidW
そうです、別のコードスニペットを追加して表示してください。 – oz1