2016-12-15 143 views
0

我想有一個像函數一樣的指針。由於我只能通過int作爲參數,我希望能夠將所有類型的數據傳遞給函數。 (我不能修改這個功能,它在SDK中被硬編碼)掙扎與memset

所以我想用一個變量的id,然後重新賦值給另一個值,這將是我的函數。

我想有這樣的事情誰正在

import ctypes 

a = 10 
b = 12 
print b #here I want 12 

ctypes.memset(id(b), a, 8) 
print b #here I want 10 

的可能性使用Python類型將是巨大的,這樣我就能還通過一個可調用對象。

+0

你是否也可以通過'long'作爲參數? –

+0

文檔說int,但我測試了很長時間它的工作。 使用long而不是int會有什麼好處? 無論如何感謝您花時間回答 – graphos

+0

您可以使用列表:'a = [10]; B = [12];打印b [0]; B = A;打印b [0];一個[0] = 8; '' –

回答

-1

更新:

由於主線程和後臺線程在同一個程序和共享內存。您可以使用一個字典來存儲變量及其鍵創建容器:

import random 

mystorage = {} 


def getint(value): 
    while True: 
     key = random.randint(0, 0xffffffff) 
     if key in mystorage: 
      continue 
     mystorage[key] = value 
     return key 


def getvalue(key): 
    return mystorage.get(key) 

您可能需要如果鍵衝突根據您的情況進行測試時加寫鎖。但通常這對多線程程序很好。


只是一個主意,用int(實際上long)類型傳遞任何picklable對象:

import codecs 
import pickle 


def dumps(payload): 
    data = pickle.dumps(payload) 
    return int(codecs.encode(data, 'hex'), 16) 


def loads(intval): 
    data = codecs.decode(hex(intval)[2:].encode('ascii'), 'hex') 
    return pickle.loads(data) 


assert loads(dumps({'foo': 'bar'})) == {'foo': 'bar'} 
# no error 

如果您正在使用Python 3.2+,您還可以使用int.from_bytes()int.to_bytes()實現這一目標。

+0

這樣的指針謝謝你是一個好主意。 但可悲的是,我們都粘2.7蟒蛇,它似乎在內部的SDK從長期做一個轉換爲int,因爲我得到這個錯誤: OverflowError:Python的詮釋太大,轉換爲C長 不過是一個不錯的主意! – graphos

+0

@graphos那麼如果你可以多次調用SDK,你可以將大數字分成幾個小數字。然後它不會給OverflowError。如果SDK無法保證按順序運行數字,您甚至可以保留一些序列字節以保持這些數字的順序。 –

+0

是的,這可能是一個想法,但它不是乾淨的,因爲傳遞給該函數的參數在主線程中,而我們對該函數的調用在後臺線程上。這將導致主線的洪水和潛伏期。但這是一個可行的解決方案。所以如果沒有其他解決方案,我會去做。 – graphos