Проблема, связанная с модулем “hashlib” версии 3.0
-
19-08-2019 - |
Вопрос
Я работал над портированием модуля 2.5 на 3.0, в основном для моего собственного образования, когда я застрял.Класс "Builder" имеет в качестве инициализатора:
def __init__(self, **options):
self._verifyOptions(options)
self._options = options
self._initDigest()
self._initBuildNames()
self._methods = []
Но ошибка возникает при:
def _initDigest(self):
import os, sys, hashlib
digester = hashlib.md5()
digester.update(self._options.get('code'))
self._digest = digester.hexdigest()
который имеет в качестве обратной связи:
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
Я прогнал его через 2to3, но он не реагирует на это.Насколько я могу судить, функция update ожидает, что аргумент будет в виде байтов / буфера, но я попробовал несколько различных методов для его преобразования, но безуспешно.
Как всегда, мы были бы очень признательны за любую помощь.:)
Решение
Я предполагаю, что эта строка:
digester.update(self._options.get('code'))
должен стать:
digester.update(self._options.get('code').encode("utf-8"))
Фактическая желаемая кодировка в вашем случае может отличаться, но UTF-8 будет работать во всех случаях.
Другие советы
Я еще не пробовал 3.0.Но теперь существует большее различие между последовательностью байтов и строками.Последние содержат кодовые точки unicode, в то время как первые содержат не unicode, а только encoded
строки в юникоде.Хэши оперируют последовательностями байтов.Таким образом, вам придется сначала закодировать ваши строки (в юникоде), прежде чем переводить их в хэш.