Cython:访问CPython对象的私有C成员

时间:2015-10-12 17:32:06

标签: python c types cython

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崩溃了。

如果这种方法已经过时/不再受支持,还有其他选择吗?

1 个答案:

答案 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")