3 votes

TypeError : argument chaîne de caractères sans encodage en 3.4 mais pas en 3.6

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X