首页 存档 技术 查看内容

系列:Python扩展模块(2)

2018-3-30 13:00 |来自: 互联网 376 0

摘要: 一、 用兼容层封装数据类型 在这之前首先先思考一个问题,我们调用的C语言的函数,那么传进去的数据也一定要满足C语言的规范。虽然Python底层是C,但是做了高度抽象封装。那么它还符不符合C的要求呢? 首先,我们来 ...


一、 用兼容层封装数据类型

在这之前首先先思考一个问题,我们调用的C语言的函数,那么传进去的数据也一定要满足C语言的规范。虽然Python底层是C,但是做了高度抽象封装。那么它还符不符合C的要求呢?

首先,我们来看个例子,看看如果不利用兼容层会有什么问题:


Python学习交流 330637182 群内每天更新相关资料

果不其然,就这么报错了!看样子其中有一些任然可以,有一些就不符合要求了。

其实,除了整数,字符串和字节对象以外的所有Python类型必须要通过它们相应的ctypes类型来包装,因此我们可以用兼容层将他们封装成需要的C数据类型。

在来看看如下的代码:


Python学习交流 330637182 群内每天更新相关资料

我们使用 c_double 类型封装了我们的浮点数。果不其然,我们就可以正确运行我们的代码了。看样子,兼容层,帮我们做了一些事情。

那么究竟兼容层棒我们做了什么呢?我们能不能利用这个机制传递我们自定义的类型呢?当然是有办法的!

二、 自定义类型

话不多说,直接上代码:

Python学习交流 330637182 群内每天更新相关资料

看来我们给的这个Flasks类型完全可以传入,果然有这么一种机制。

从以上代码可以看出来,其实真正的秘诀就在于_as_parameter_ 属性。

那么究竟发生了什么呢?

其实,ctypes参数转换是允许使用自定义的类的实例来作为ctypes函数参数的。ctypes会查找 _as_parameter_ 属性并用作函数参数。当然,这必须符合ctypes的要求(如果不包装则只能是整数,字符串或字节)。

简单来说,就是,通过 _as_parameter_ 参数来将我们的数据转换成符合C语言要求的类型,说到底还是使用兼容层。当然,如果你不想把数据在_as_parameter_ 中存死,可以使用描述符让数据临时请求。这样就能时间动态生成参数了。



声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部