【发布时间】:2016-01-10 06:40:26
【问题描述】:
http://docs.cython.org/src/userguide/extension_types.html#external-extension-types 解释了如何访问 Python 扩展模块中对象的内部(隐藏或“私有”)C 级成员。
我想从sqlite3.Connection 对象访问内部成员db,该对象在Python2 源文件Modules/_sqlite/connection.h 的结构pysqlite_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")
这用 cython 编译,但是当我在结果上运行 C 编译器时,我得到:
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 中,而是在我的 @ 987654333@ Cython 班。但在dbname 函数中,参数明确定义为xConnection。这似乎是cython 编译器中的一个错误。还是我错过了什么?
我尝试在文档中提供type 参数,例如:
ctypedef class __builtin__.xConnection [object pysqlite_Connection, type pysqlite_ConnectionType]:
cdef sqlite3Connection conn
但随后cython 崩溃了。
如果此方法已过时/不再受支持,是否有替代方法?
【问题讨论】: