Проблема, связанная с модулем “hashlib” версии 3.0

StackOverflow https://stackoverflow.com/questions/343204

  •  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 строки в юникоде.Хэши оперируют последовательностями байтов.Таким образом, вам придется сначала закодировать ваши строки (в юникоде), прежде чем переводить их в хэш.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top