#python #json #object #generator
#python #json #объект #генератор
Вопрос:
Возможно ли отправлять функции или генераторы с использованием протокола json?
Что я пробовал:
import json
import pickle
def gen():
for i in range(10):
yield i
pickled= pickle.dumps(gen)
jsoned = json.dumps(pickled)
enjsoned = json.loads(jsoned)
enpickled = pickle.loads(enjsoned)
>>> for i in enpickled():
print(i)
0
1
2
3
4
5
6
7
8
9
>>> print(pickled, type(pickled))
('c__main__ngennp0n.', <type 'str'>)
>>> print(jsoned,type(jsoned))
('"c__main__\ngen\np0\n."', <type 'str'>)
>>> print(enjsoned,type(enjsoned))
(u'c__main__ngennp0n.', <type 'unicode'>)
Из кода очевидно, что у меня была идея обработать его, отправить через json и включить где-нибудь еще.
Это работает внутри скрипта. Но, конечно, я не могу отправить его, потому что, как вы можете видеть, кодировка в виде строки. Итак, если я отправлю его, например, через MQTT, я бы просто отправил некоторую ссылку в строке.
Есть идеи, возможно ли отправлять через функции или генераторы json?
Также я хотел бы отметить, что я не хочу использовать EVAL
Ответ №1:
После небольшого поиска я нашел возможный способ
import dill
def gen():
for i in range(10):
yield i
import dill
dilled_gen = dill.dumps(gen)
with open('test.txt','w') as f:
f.write(dilled_gen )
with open('test.txt','r') as f:
gen_byted = f.read()
gen_reloaded = dill.loads(gen_byted)
>>> for i in gen_reloaded():
i
0
1
2
3
4
5
6
7
8
9
Заполненный генератор в байтах:
>>> dilled_gen
'x80x02cdill._dilln_create_functionnqx00(cdill._dilln_load_typenqx01Ux08CodeTypeqx02x85qx03Rqx04(Kx00Kx01Kx02KcU xx19x00tx00x00dx01x00x83x01x00D]x0bx00}x00x00|x00x00Vx01qrx00Wdx00x00Sqx05NKnx86qx06Ux05rangeqx07x85qx08Ux01iqtx85qnU5C:\Users\marti\Desktop\Stackoverflow\dumpGenerator.pyqx0bUx03genqx0cKx04Ux04x00x01x13x01qr))tqx0eRqx0fc__builtin__n__main__nhx0cNN}qx10tqx11Rqx12.'