2011-06-08 49 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。

盧克說這幾乎是什麼,所以他給的可能不是黑客。