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






3.0 пока не пробовал. Но теперь существует большее различие между последовательностью байтов и строк. Последние содержат кодовые точки Unicode, в то время как первые не содержат Unicode, а только строки Unicode encoded. Хеши работают с последовательностями байтов. Таким образом, вам нужно будет сначала закодировать свои (unicode) строки, предварительно загрузив их в хеш.
Я предполагаю, что эта строка:
digester.update(self._options.get('code'))
должно стать:
digester.update(self._options.get('code').encode("utf-8"))
Фактическая желаемая кодировка в вашем случае может быть другой, но UTF-8 будет работать во всех случаях.
Вы успешно исправили эту ошибку и обучили меня этой задаче. Поздравляю и благодарю!