J'ai écrit une classe pour représenter les données compressées LZMA avec une chaîne encodée en base64 :
from base64 import b64decode
from lzma import LZMADecompressor
class B64LZMA(str):
"""A string of base64 encoded, LZMA compressed data."""
def __bytes__(self):
"""Returns the decompressed data."""
return LZMADecompressor().decompress(b64decode(self.encode()))
def __str__(self):
"""Returns the string decoded from __bytes__."""
return bytes(self).decode()
TEST_STR = B64LZMA('/Td6WFoAAATm1rRGAgAhARYAAAB0L+WjAQALSGVsbG8gd29ybGQuAGt+oFiSvoAYAAEkDKYY2NgftvN9AQAAAAAEWVo=')
if __name__ == '__main__':
print(TEST_STR)
Alors que cela fonctionne parfaitement avec python 3.6 sur ArchLinux, j'obtiens l'erreur suivante avec python 3.4 sur Debian 8 :
Traceback (most recent call last):
File "./test.py", line 22, in <module>
print(TEST_STR)
File "./test.py", line 16, in __str__
return bytes(self).decode()
TypeError: string argument without an encoding
Pourquoi y a-t-il cette différence de comportement entre python 3.4 et python 3.6 et comment puis-je faire fonctionner la classe ci-dessus dans python 3.4 également ?
Mise à jour
script pour vérifier :
#! /usr/bin/env python3
from base64 import b64decode
from lzma import LZMADecompressor
from sys import version
class B64LZMA(str):
"""A string of base64 encoded, LZMA compressed data."""
def __bytes__(self):
"""Returns the decompressed data."""
return LZMADecompressor().decompress(b64decode(self.encode()))
def __str__(self):
"""Returns the string decoded from __bytes__."""
return bytes(self).decode()
TEST_STR = B64LZMA('/Td6WFoAAATm1rRGAgAhARYAAAB0L+WjAQALSGVsbG8gd29ybGQuAGt+oFiSvoAYAAEkDKYY2NgftvN9AQAAAAAEWVo=')
if __name__ == '__main__':
print(version)
print(TEST_STR)
SHA-256 sum: 64513a7508b20dda5cc26c37fa4dc8f516369937569833bb0957c10ea887ae00
Sortie avec python 3.4 sur Debian 8 :
$ ./test.py
3.4.2 (default, Oct 8 2014, 10:45:20)
[GCC 4.9.1]
Traceback (most recent call last):
File "./test.py", line 24, in <module>
print(TEST_STR)
File "./test.py", line 17, in __str__
return bytes(self).decode()
TypeError: string argument without an encoding
Sortie avec python 3.6 sur ArchLinux :
$ ./test.py
3.6.4 (default, Dec 23 2017, 19:07:07)
[GCC 7.2.1 20171128]
Hello world.