Удалить обертку от маринованного предмета? - PullRequest
1 голос
/ 11 марта 2019

В следующем коде:

>>> import pickle
>>>
>>> class Thing:
    def __init__(self):
        self.name = "stackoverflow"
        self.age = 11

>>> a = pickle.dumps(Thing())
>>> a
b'\x80\x03c__main__\nThing\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\r\x00\x00\x00stackoverflowq\x04X\x03\x00\x00\x00ageq\x05K\x0bub.'
>>> str(a)
"b'\\x80\\x03c__main__\\nThing\\nq\\x00)\\x81q\\x01}q\\x02(X\\x04\\x00\\x00\\x00nameq\\x03X\\r\\x00\\x00\\x00stackoverflowq\\x04X\\x03\\x00\\x00\\x00ageq\\x05K\\x0bub.'"

У меня вопрос, как мне преобразовать str(a) обратно в a, поскольку, как только это преобразование произойдет, я могу легко декодировать, используя pickle.loads()

Причина, по которой я конвертирую в строку, заключается в том, что я хочу добавить str(a) строку к другой строке, которая будет далее "засолена". Большинство других постов, которые я видел, предполагают, что байты уже являются кодировкой строки или преобразования строки в байт, ни одно из которых не является.

1 Ответ

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

Кажется, что работает следующее, потому что допустимы произвольные двоичные строки latin1, которые всегда могут быть декодированы в Unicode, а затем снова закодированы обратно в исходную строку (как указано в в этом ответе на Свен Марнач ).

import pickle

class Thing:
    def __init__(self):
        self.name = "stackoverflow"
        self.age = 11

a = pickle.dumps(Thing())
str_a = a.decode('latin1')    
b = str_a.encode('latin1')

assert a == b
...