Проблема с модулем hashlib версии 3.0 - PullRequest
2 голосов
/ 05 декабря 2008

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

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

Ответы [ 2 ]

4 голосов
/ 05 декабря 2008

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

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

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

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

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

0 голосов
/ 05 декабря 2008

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

...