Problema con respecto a 3.0 & # 8220; hashlib & # 8221; módulo
-
19-08-2019 - |
Pregunta
He estado trabajando para obtener un módulo 2.5 portado a 3.0, principalmente para mi propia educación, cuando me he quedado atascado. La clase " Constructor " tiene como init:
def __init__(self, **options):
self._verifyOptions(options)
self._options = options
self._initDigest()
self._initBuildNames()
self._methods = []
Pero el error ocurre en:
def _initDigest(self):
import os, sys, hashlib
digester = hashlib.md5()
digester.update(self._options.get('code'))
self._digest = digester.hexdigest()
que tiene como rastreo:
Traceback (most recent call last):
File "<pyshell#5>", line 5, in <module>
""", language="Cee")
File "C:\Python30\lib\site-packages\PyInline\__init__.py", line 31, in build
b = m.Builder(**args)
File "C:\Python30\lib\site-packages\PyInline\Cee.py", line 17, in __init__
self._initDigest()
File "C:\Python30\lib\site-packages\PyInline\Cee.py", line 27, in _initDigest
digester.update(self._options.get('code'))
TypeError: object supporting the buffer API required
Lo ejecuté a través de 2to3, pero no se está dando cuenta. Por lo que puedo decir, la función de actualización espera que el argumento tenga la forma de bytes / búfer, pero he intentado varios métodos diferentes para convertirlo y no he tenido éxito.
Como siempre, cualquier ayuda sería muy apreciada. :)
Solución
Supongo que esta línea:
digester.update(self._options.get('code'))
debería convertirse en:
digester.update(self._options.get('code').encode("utf-8"))
La codificación deseada real podría ser diferente en su caso, pero UTF-8 funcionará en todos los casos.
Otros consejos
Todavía no he probado 3.0. Pero ahora hay una mayor distinción entre una secuencia de bytes y cadenas. Los últimos contienen puntos de código unicode, mientras que los primeros no contienen unicode sino solo cadenas unicode codificadas
. Los hashes operan en secuencias de bytes. Por lo tanto, primero deberá codificar sus cadenas (unicode) antes de alimentarlas a un hash.