Это простой вопрос, но я не могу понять его. Я хочу взять байты, выведенные из pickle.dumps()
, преобразовать их str
и иметь возможность преобразовать их обратно в bytes
совместимые, чтобы pickle.loads(string_thing)
можно было восстановить исходный объект.
encoded = pickle.dumps(None)
string_encoded = to_string(encoded)
decoded = pickle.loads(safe_decoder(string_encoded))
Я знаю, что одним из возражений будет: «Зачем вам это нужно?» Ограничения на разрешенные типы.
Base64 кодирует/декодирует это…?
@deceze дает хорошую идею: используйте модуль base64
с его функциями .b64encode()
и .b64decode()
.
Вот пример:
>>> 'Álñó@'
'Álñó@'
>>> 'Álñó@'.encode()
b'\xc3\x81l\xc3\xb1\xc3\xb3@'
>>> base64.b64encode('Álñó@'.encode())
b'w4Fsw7HDs0A='
>>> base64.b64encode('Álñó@'.encode()).decode()
'w4Fsw7HDs0A='
Теперь у вас есть строка в base64. Для обратного процесса:
>>> base64.b64encode('Álñó@'.encode()).decode().encode()
b'w4Fsw7HDs0A='
>>> base64.b64decode(base64.b64encode('Álñó@'.encode()).decode().encode())
b'\xc3\x81l\xc3\xb1\xc3\xb3@'
>>> base64.b64decode(base64.b64encode('Álñó@'.encode()).decode().encode()).decode()
'Álñó@'
Это сработает для вас?
Пример использования pickle
:
>>> original_obj = 456.5
>>> original_obj
456.5
>>> type(original_obj)
<class 'float'>
>>> intermediate_str = base64.b64encode(pickle.dumps(original_obj)).decode()
>>> intermediate_str
'gANHQHyIAAAAAAAu'
>>> new_obj = pickle.loads(base64.b64decode(intermediate_str.encode()))
>>> new_obj
456.5
>>> type(new_obj)
<class 'float'>
>>> original_obj == new_obj
True
@deceze Я совсем забыл о модуле base64
! Большое спасибо!
Что, конкретно, не так с размещенным кодом?