打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
系列:Python扩展模块(2)

ctypes(二)— 基本函数调用

上一次提到了,ctypes的兼容层,这次我们直接讲利用兼容层调用函数的相关规则。

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

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

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

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

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

在来看看如下的代码:

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

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

二、 自定义类型

话不多说,直接上代码:

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

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

那么究竟发生了什么呢?

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

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
python中一个变量是如何穿梭于多线程与多进程?
Python使用ctypes模块调用DLL函数之C语言数组与numpy数组传递
Fortran基本用法小结
Simulink学习笔记(二)
用Python来使用科大讯飞语音识别,so easy
生成dll文件以及python对DLL中函数的调用(参数类型以及返回值)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服