Передайте генератор с JSON (желательно более MQTT) - PullRequest
0 голосов
/ 08 марта 2019

Можно ли отправлять функции или генераторы с протоколом 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__\ngen\np0\n.', <type 'str'>)
>>> print(jsoned,type(jsoned))
('"c__main__\\ngen\\np0\\n."', <type 'str'>)
>>> print(enjsoned,type(enjsoned))
(u'c__main__\ngen\np0\n.', <type 'unicode'>)

Из кода, очевидно, у меня была идея засолить его, отправить егоповерх json и зашифровал его где-то еще.

Это работает внутри скрипта.Но я точно не могу отправить его, потому что, как видите, кодировка в строке.Так что, если я отправлю его, например, через MQTT, я просто отправлю некоторую ссылку в строке.

Есть идеи, можно ли отправлять через функции или генераторы json?

Также мне хотелось быотметить, что я не хочу использовать EVAL

1 Ответ

0 голосов
/ 08 марта 2019

После небольшого поиска я нашел возможный путь

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 
'\x80\x02cdill._dill\n_create_function\nq\x00(cdill._dill\n_load_type\nq\x01U\x08CodeTypeq\x02\x85q\x03Rq\x04(K\x00K\x01K\x02KcU x\x19\x00t\x00\x00d\x01\x00\x83\x01\x00D]\x0b\x00}\x00\x00|\x00\x00V\x01q\r\x00Wd\x00\x00Sq\x05NK\n\x86q\x06U\x05rangeq\x07\x85q\x08U\x01iq\t\x85q\nU5C:\\Users\\marti\\Desktop\\Stackoverflow\\dumpGenerator.pyq\x0bU\x03genq\x0cK\x04U\x04\x00\x01\x13\x01q\r))tq\x0eRq\x0fc__builtin__\n__main__\nh\x0cNN}q\x10tq\x11Rq\x12.'
...