Генератор пропусков с использованием json (предпочтительно через MQTT)

#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.'