在http://docs.cython.org/src/userguide/extension_types.html#external-extension-types中,它解释了如何在Python扩展模块中访问对象的内部(隐藏或#34;私有")C级成员。
我想从db
对象访问内部成员sqlite3.Connection
,该对象在Python2源文件pysqlite_Connection
中的结构Modules/_sqlite/connection.h
中定义。我是这样做的:
文件connection.pxd:
cdef extern from "connection.h":
struct sqlite3Connection:
sqlite3 *db
ctypedef class __builtin__.xConnection [object pysqlite_Connection]:
cdef sqlite3Connection conn
然后像这样使用它:
文件vtables.pxd:
from connection cimport xConnection
cdef dbname(xConnection c):
cdef sqlite3 *d
return sqlite3_db_filename(c.conn.db, "main")
当我在结果上运行C编译器时编译cython,但是,我得到:
vtables.c:635:69: error: ‘pysqlite_Connection’ has no member named ‘conn’
__pyx_t_1 = __Pyx_PyBytes_FromString(sqlite3_db_filename(__pyx_v_c->conn.db, __pyx_k_main)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
^
生成的C代码似乎就像访问pysqlite_Connection
结构而不是包装xConnection
一样,抱怨访问conn
成员当然不在pysqlite_Connection
{1}}但在我的xConnection
Cython课程中。但在dbname
函数中,参数明确定义为xConnection
。这似乎是cython
编译器中的错误。或者我错过了什么?
我尝试在文档中提供type
参数,例如:
ctypedef class __builtin__.xConnection [object pysqlite_Connection, type pysqlite_ConnectionType]:
cdef sqlite3Connection conn
但随后cython
崩溃了。
如果这种方法已经过时/不再受支持,还有其他选择吗?
答案 0 :(得分:2)
我不认为你完成了你认为你做过的事情。您还没有创建名为__builtin__.xConnection
的包装类。您已经向Cython保证,已经有一个名为pysqlite_Connection
的类,并且它使用C结构sqlite3Connection
存储,并且它包含一个db
结构,其中包含一个名为{的成员{1}}。
我想你想告诉Cython你已经有一个名为sqlite.Connection
的类,它存储在C结构pysqlite_Connection
中并且包含一个名为db
的成员:
cdef extern from "connection.h":
# I assume you definite this somewhere else
ctypedef struct sqlite3:
pass
ctypedef class sqlite.Connection [object pysqlite_Connection]:
cdef sqlite3* db
cdef dbname(Connection c):
return sqlite3_db_filename(c.db, "main")