我想使用sage和外部c库。外部库已经有用cython编写的python绑定,并处理python&#39的数字类和gmp整数之间的转换。
为了适应这种情况,我想绕过那种转换:sage整数已经在引擎盖下使用了gmp。但为了使我的代码编译(和工作),我在任何地方使用显式类型转换,我认为应该有更好的方法来做到这一点。如果我可以把我想要上游的代码放到最后,那就最终了。
在sage中,整数类型(mpz_t
)的gmp绑定在pxd
文件中声明:
ctypedef struct __mpz_struct:
int _mp_alloc
int _mp_size
mp_ptr _mp_d
ctypedef __mpz_struct mpz_t[1]
但外部库对gmp有自己的pxd
并声明:
ctypedef struct mpz_t:
pass
在sage.mpz_t
和mylib.mpz_t
之间手动转换我的代码工作正常,但是将mylib的绑定重写为使用sage的gmp绑定会好得多而不是自己的?我想是的,但是怎么样?
gmp中的功能签名之间也存在不一致,例如在圣人:
void mpz_set (mpz_t rop, mpz_t op)
但是在mylib中,会出现一个狂野的const
:
void mpz_set(mpz_t rop, const mpz_t op)
我有一个暗示,sage和mylib之间的区别在于mylib将mpz_t
视为不透明的结构,但是sage深入研究了实现。我对低级别C没有真正的经验,所以对我可以用来教育自己的材料的任何参考都将不胜感激。
答案 0 :(得分:1)
签名的差异不是你需要担心的 - 对于cdef extern
声明,Cython只需知道足以正确调用C代码。因此,const
的存在与否对Cython几乎没有影响。同样,如果你不在Cython中使用它们,则没有必要声明struct中的所有字段。
如果您准备更改“mylib”代码以使用sage声明,那么这很容易 - 只需使用cimport
即可。我相信正确的导入应该是
from sage.libs.gmp.types cimport mpz_t
(这依赖于Python路径上安装的sage .pxd文件。)对你想要使用的函数做类似的事情。