2011-06-08 51 views
6

当包装用CFUNCTYPE型Python函数,我已经发现,非指针类型被自动转换为虽然他们value属性被调用。防止自动类型转换回调函数

我怎样才能抑制这种自动转换?

from ctypes import * 

funcspec = CFUNCTYPE(c_int, c_int, POINTER(c_int)) 

@funcspec 
def callback(the_int, the_int_p): 
    print(vars()) 
    return 3 

print(callback(c_int(1), byref(c_int(2)))) 

将会产生(python3cfunctype_type_conversion.py):

{'the_int': 1, 'the_int_p': <__main__.LP_c_int object at 0x2671830>} 
3 

我想:

{'the_int': c_int(1), 'the_int_p': <__main__.LP_c_int object at 0x2671830>} 
c_int(3) 
+3

这么做并不是完全相同CFUNCTYPE的目的是什么? ctypes的目的是与C-API接口并从C类型和Python类型来回转换。你不应该保留c_int的东西,直接用它们做事。例如,您不能将c_int添加到另一个c_int。 – 2011-06-08 09:47:54

回答

2

这是一个黑客位的,但它可能为你工作。希望别人会附和一个更清洁的方式..

from ctypes import * 

class c_int_hack(c_int): 
    def from_param(self, *args): 
     return self 

funcspec = CFUNCTYPE(c_int, c_int_hack, POINTER(c_int)) 

@funcspec 
def callback(the_int, the_int_p): 
    print(vars()) 
    print(the_int.value) 
    return 3 

print(callback(c_int(1), byref(c_int(2)))) 

..和输出:

{'the_int': <c_int_hack object at 0xb7478b6c>, 'the_int_p': <__main__.LP_c_long object at 0xb747892c>} 
1 
3 
0

我一直在ctypes的代码最近看,以为我也许能找出这一个。这样做的c代码在callproc.c中(这里是source for 2.7.2)。

从源头上相关评论:

。如果“变换器”存在(转换器是一个argtypes序列 from_param方法),对于 每个项目‘callargs’转换器被称为和 结果传递给ConvParam。如果 “变换器”不存在时,每个 参数被直接传递到 ConvParm。

卢克说这几乎是什么,所以他给的可能不是黑客。