2016-12-15 145 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