我一直在努力将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运行它,但它没有接受它。据我所知,更新函数期望参数以字节/缓冲区的形式出现,但我尝试了几种不同的方法来转换它并且没有成功。
与往常一样,我们将非常感谢任何协助。 :)
答案 0 :(得分:4)
我猜这一行:
digester.update(self._options.get('code'))
应该成为:
digester.update(self._options.get('code').encode("utf-8"))
在您的情况下,实际所需的编码可能会有所不同,但UTF-8将适用于所有情况。
答案 1 :(得分:0)
我还没试过3.0。但是现在字节序列和字符串之间存在更大的区别。后者持有unicode代码点,而前者不包含unicode但仅包含encoded
个unicode字符串。哈希对字节序列进行操作。因此,您必须先对您的(unicode)字符串进行编码,然后将它们提供给哈希值。