2016-12-15 6 views
0

Я хотел был бы иметь указатель как функция. Поскольку мне разрешено передавать только int в качестве аргумента, и я хотел бы иметь возможность передавать все виды данных в функцию. (Я не могу изменить эту функцию, она жестко закодирована в SDK)Борьба с memset

Так что я думал использовать идентификатор переменной, а затем повторно назначить значение другому значению, которое будет в моей функции.

Я хотел бы иметь что-то подобное, кто работает

import ctypes 

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

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

возможность использовать тип питона будет большим, таким образом я смогу также передать вызываемый объект.

+0

Можете ли вы передать «длинный» как аргумент? –

+0

Документация говорит int, но я тестировал ее с долгой работой. Какая польза от использования long вместо int? в любом случае спасибо, что нашли время ответить – graphos

+0

Вы можете использовать списки: 'a = [10]; б = [12]; print b [0]; B = A; print b [0]; а [0] = 8; print b [0]; ' –

ответ

-1

Update:

Поскольку основной поток и фоновый поток находятся на одной и той же программе и обмена памяти. Вы можете использовать один словарь, чтобы создать контейнер для хранения переменных и их ключей:

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), чтобы передать какие-либо объекты пригодны для консервирования:

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 Int слишком большой, чтобы преобразовать C долгое Но была хорошая идея! – graphos

+0

@graphos Ну, если вы можете многократно вызывать SDK, вы можете разделить большое число на несколько меньших. Тогда он не даст OverflowError. Вы даже можете сохранить несколько байтов последовательности, чтобы сохранить эти номера в порядке, если SDK не может гарантировать выполнение номеров в порядке. –

+0

Да, это может быть идея, но она не чистая, так как аргумент, передаваемый этой функции, находится в основном потоке, а наш вызов функции находится в фоновом потоке. Это приведет к потоку и латентности основной нити. Но это решение, которое будет работать. Поэтому я собираюсь пойти на это, если нет другого решения. – graphos