• [^] # Re: Question

    Posté par (site web personnel) . En réponse au journal Exit Pyth(on|ran)2. Évalué à 2.

    [...] à part la différenciation str/bytes qui ajoute de la complexité apparente à Python3. Je dis bien apparente car elle force au final à raisonner de manière plus précise sur nos données [...]

    Il y a quelque temps, j'ai développé des fonctions pour faire transiter des chaînes de caractères via des sockets. Bien que je n'avais quasiment jamais fait de Python, j'ai trouvé la version pour Python 2 assez facile à écrire. Par contre, pour la version Python 3, ça a quand même été un petit peu plus compliqué.

    Voilà les deux versions ; on ne sait jamais, ça servira peut-être à quelqu'un...

    (Oui, je sais, je n'aurais pas du utiliser le camelCase, mais je débutais en Python, et n'avais pas connaissance des règles en la matière...)

    La version pour Python 2 :

    def writeByte(socket, byte):
     socket.send(chr(byte))
    def writeSize(socket, size):
     result = chr(size & 0x7f)
     size >>= 7
     while size != 0:
     result = chr((size & 0x7f) | 0x80) + result
     size >>= 7
     socket.send(result)
    def writeString(socket, string):
     writeSize(socket, len(string))
     socket.send(string)
    def writeStringNUL(socket, string):
     socket.send(string + "0円")
    def getByte(socket):
     return ord(socket.recv(1))
    def getSize(socket):
     byte = getByte(socket)
     size = byte & 0x7f
     while byte & 0x80:
     byte = getByte(socket)
     size = (size << 7) + (byte & 0x7f)
     return size
    def getString(socket):
     size = getSize(socket)
     if size:
     return socket.recv(size)
     else:
     return ""

    et la version pour Python 3 :

    def writeByte(socket, byte):
     socket.send(bytes([byte]))
    def writeSize(socket, size):
     result = bytes([size & 0x7f])
     size >>= 7
     while size != 0:
     result = bytes([(size & 0x7f) | 0x80]) + result
     size >>= 7
     socket.send(result)
    def writeString(socket, string):
     bString = bytes(string, "utf-8")
     writeSize(socket, len(bString))
     socket.send(bString)
    def writeStringNUL(socket, string):
     socket.send(bytes(string + "0円", "utf-8"))
    def getByte(socket):
     return ord(socket.recv(1))
    def getSize(socket):
     byte = getByte(socket)
     size = byte & 0x7f
     while byte & 0x80:
     byte = getByte(socket)
     size = (size << 7) + (byte & 0x7f)
     return size
    def getString(socket):
     size = getSize(socket)
     if size:
     return socket.recv(size).decode("utf-8")
     else:
     return ""

    (Code source extrait respectivement de https://github.com/epeios-q37/atlas-python/blob/be77cf9d5c8921877fecc1ed1bfa3819fc7e7546/atlastk/XDHqDEMO2.py et https://github.com/epeios-q37/atlas-python/blob/be77cf9d5c8921877fecc1ed1bfa3819fc7e7546/atlastk/XDHqDEMO3.py.)

    Zelbinium: pour la génération qui crée, pas celle qui scrolle...