Problema em relação módulo “hashlib” 3.0 do
-
19-08-2019 - |
Pergunta
Eu tenho trabalhado em obter um módulo de 2,5 portado para 3,0, principalmente para minha própria educação, quando eu comecei preso. A classe "Builder" tem como inicialização:
def __init__(self, **options):
self._verifyOptions(options)
self._options = options
self._initDigest()
self._initBuildNames()
self._methods = []
Mas o erro ocorre em:
def _initDigest(self):
import os, sys, hashlib
digester = hashlib.md5()
digester.update(self._options.get('code'))
self._digest = digester.hexdigest()
que tem como traceback:
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
Eu executá-lo através 2to3, mas não está pegando nele. Tanto quanto eu posso dizer, a função de atualização está esperando o argumento de ser na forma de bytes / buffer, mas eu tentei vários métodos diferentes para convertê-lo e não conseguiram.
Como sempre, qualquer ajuda seria muito apreciada. :)
Solução
Eu estou supondo que esta linha:
digester.update(self._options.get('code'))
deve tornar-se:
digester.update(self._options.get('code').encode("utf-8"))
A codificação real desejado poderia ser diferente no seu caso, mas UTF-8 vai funcionar em todos os casos.
Outras dicas
Eu não tentei 3.0 ainda. Mas agora há uma maior distinção entre uma sequência de bytes e strings. Os últimos codepoints espera unicode Enquanto o primeiro não possuem unicode, mas strings unicode única encoded
. Hash operar em sequências de bytes. Assim você terá para codificar suas cordas (unicode) primeiro bevore alimentá-los para um hash.