Problem in Bezug auf 3.0 der „hashlib“ -Modul
-
19-08-2019 - |
Frage
Ich habe Arbeit wurde eine 2.5-Modul 3.0, vor allem für meine eigene Ausbildung portierte auf immer, wenn ich bekommen habe stecken. Die Klasse "Builder" hat als init:
def __init__(self, **options):
self._verifyOptions(options)
self._options = options
self._initDigest()
self._initBuildNames()
self._methods = []
Aber der Fehler tritt auf:
def _initDigest(self):
import os, sys, hashlib
digester = hashlib.md5()
digester.update(self._options.get('code'))
self._digest = digester.hexdigest()
, die hat als seine Zurückverfolgungs:
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
Ich habe es durch 2to3 laufen, aber es zieht an nicht darauf. Soweit ich sagen kann, wird die Update-Funktion das Argument erwartet in Form von Bytes / Puffer zu sein, aber ich habe verschiedene Methoden versucht, es zu konvertieren und nicht gelungen.
Wie immer würde jede Hilfe sehr geschätzt. :)
Lösung
Ich vermute, dass diese Linie:
digester.update(self._options.get('code'))
sollte werden:
digester.update(self._options.get('code').encode("utf-8"))
Die tatsächliche gewünschte Codierung in Ihrem Fall anders sein könnte, aber UTF-8 wird in allen Fällen.
Andere Tipps
Ich habe nicht 3.0 noch nicht ausprobiert. Aber es gibt jetzt einen größeren Unterschied zwischen einer Folge von Bytes und Strings. Letztere halten Unicode-Codepoints während der ehemaligen halten nicht Unicode aber nur encoded
Unicode-Strings. Hashes arbeiten auf Sequenzen von Bytes. So müssen Sie Ihre (Unicode) Zeichenfolgen codieren ersten bevore sie zu einem Hash-Fütterung.