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_ 中存死,可以使用描述符让数据临时请求。这样就能时间动态生成参数了。
联系客服