Проблема с модулем "hashlib" 3.0

Я работал над портированием модуля 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, но он не улавливает его. Насколько я могу судить, функция обновления ожидает, что аргумент будет в виде байтов / буфера, но я пробовал несколько разных методов для его преобразования и не добился успеха.

Как всегда, мы будем благодарны за любую помощь. :)

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
2 051
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

3.0 пока не пробовал. Но теперь существует большее различие между последовательностью байтов и строк. Последние содержат кодовые точки Unicode, в то время как первые не содержат Unicode, а только строки Unicode encoded. Хеши работают с последовательностями байтов. Таким образом, вам нужно будет сначала закодировать свои (unicode) строки, предварительно загрузив их в хеш.

Ответ принят как подходящий

Я предполагаю, что эта строка:

digester.update(self._options.get('code'))

должно стать:

digester.update(self._options.get('code').encode("utf-8"))

Фактическая желаемая кодировка в вашем случае может быть другой, но UTF-8 будет работать во всех случаях.

Вы успешно исправили эту ошибку и обучили меня этой задаче. Поздравляю и благодарю!

J.T. Hurley 05.12.2008 12:18

Другие вопросы по теме