赛通 "Cannot assign default value to fields in cdef classes, structs or unions"
Cython "Cannot assign default value to fields in cdef classes, structs or unions"
我第一次尝试将 Python 代码移植到 Cython。我对 C 的经验非常有限。我正在尝试制作一个相对简单的 class 来存储多维数组。为了这道题的目的,让我们把它留给属性时间的单个长度为1的一维数组。目前,我收到错误:
cdef np.ndarray[np.int64_t, ndim=1] time = np.empty([1], dtype=np.int64)
^
------------------------------------------------------------
data.pyx:22:40: Cannot assign default value to fields in cdef classes, structs or unions
这是最相关的文件。
data.pyx
import numpy as np
cimport numpy as np
cdef extern from "data_extern.h":
cppclass _Data "Data":
np.int64_t time64[1]
double x_coord, y_coord, z_coord
_Data(np.int64_t *time, double x, double y, double z)
cdef class Data:
cdef _Data *thisptr
cdef np.ndarray[np.int64_t, ndim=1] time = np.empty([1], dtype=np.int64)
def __cinit__(self, np.int64_t time[1], x, y, z):
self.thisptr = new _Data(&time[0], x, y, z)
def __dealloc__(self):
del self.thisptr
data_extern.h
#ifndef DATA_EXTERN_H
#define DATA_EXTERN_H
class Data {
public:
signed long long time64[1];
double x_coord, y_coord, z_coord;
Data();
Data(signed long long time[1], double x, double y, double z;
~Data();
};
#endif
data_extern.cpp
#include <iostream>
#include "data_extern.h"
Data::Data () {}
// Overloaded constructor
Data::Data (signed long long time[1], double x, double y, double z {
this->time64 = time[0];
this->x_coord = x;
this->y_coord = y;
this->z_coord = z;
}
// Destructor
Data::~Data () {}
我知道我的代码可能存在多个问题,但如果有人可以提供错误消息的解释,我们将不胜感激。
问题如错误消息中所述:您无法为 cdef class 的 C 级属性设置默认值。您可以通过在 __cinit__
构造函数中设置值来解决此问题,如下所示:
cdef class Data:
cdef _Data *thisptr
cdef np.ndarray[np.int64_t, ndim=1] time
def __cinit__(self, np.int64_t time[1], x, y, z):
self.thisptr = new _Data(&time[0], x, y, z)
self.time = np.empty([1], dtype=np.int64)
def __dealloc__(self):
del self.thisptr
请注意,整个 np.ndarray 语法已经过时了。除非你对使用 numpy 类型死心塌地(这在你的代码中似乎是不必要的,因为你正在与某种 c++ 库交互),你可以使用更现代的 typed memoryview 语法。您可以使用 from libc.stdint cimport *
导入大小整数类型以使用它们而不是 numpy 类型。
我第一次尝试将 Python 代码移植到 Cython。我对 C 的经验非常有限。我正在尝试制作一个相对简单的 class 来存储多维数组。为了这道题的目的,让我们把它留给属性时间的单个长度为1的一维数组。目前,我收到错误:
cdef np.ndarray[np.int64_t, ndim=1] time = np.empty([1], dtype=np.int64)
^
------------------------------------------------------------
data.pyx:22:40: Cannot assign default value to fields in cdef classes, structs or unions
这是最相关的文件。
data.pyx
import numpy as np
cimport numpy as np
cdef extern from "data_extern.h":
cppclass _Data "Data":
np.int64_t time64[1]
double x_coord, y_coord, z_coord
_Data(np.int64_t *time, double x, double y, double z)
cdef class Data:
cdef _Data *thisptr
cdef np.ndarray[np.int64_t, ndim=1] time = np.empty([1], dtype=np.int64)
def __cinit__(self, np.int64_t time[1], x, y, z):
self.thisptr = new _Data(&time[0], x, y, z)
def __dealloc__(self):
del self.thisptr
data_extern.h
#ifndef DATA_EXTERN_H
#define DATA_EXTERN_H
class Data {
public:
signed long long time64[1];
double x_coord, y_coord, z_coord;
Data();
Data(signed long long time[1], double x, double y, double z;
~Data();
};
#endif
data_extern.cpp
#include <iostream>
#include "data_extern.h"
Data::Data () {}
// Overloaded constructor
Data::Data (signed long long time[1], double x, double y, double z {
this->time64 = time[0];
this->x_coord = x;
this->y_coord = y;
this->z_coord = z;
}
// Destructor
Data::~Data () {}
我知道我的代码可能存在多个问题,但如果有人可以提供错误消息的解释,我们将不胜感激。
问题如错误消息中所述:您无法为 cdef class 的 C 级属性设置默认值。您可以通过在 __cinit__
构造函数中设置值来解决此问题,如下所示:
cdef class Data:
cdef _Data *thisptr
cdef np.ndarray[np.int64_t, ndim=1] time
def __cinit__(self, np.int64_t time[1], x, y, z):
self.thisptr = new _Data(&time[0], x, y, z)
self.time = np.empty([1], dtype=np.int64)
def __dealloc__(self):
del self.thisptr
请注意,整个 np.ndarray 语法已经过时了。除非你对使用 numpy 类型死心塌地(这在你的代码中似乎是不必要的,因为你正在与某种 c++ 库交互),你可以使用更现代的 typed memoryview 语法。您可以使用 from libc.stdint cimport *
导入大小整数类型以使用它们而不是 numpy 类型。