2

当我遇到困难时,我一直在努力将 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 运行它,但它没有接受它。据我所知,更新函数期望参数采用字节/缓冲区的形式,但我尝试了几种不同的方法来转换它,但都没有成功。

与往常一样,我们将不胜感激任何帮助。:)

4

2 回答 2

4

我猜这条线:

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

应该变成:

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

在您的情况下,实际所需的编码可能会有所不同,但 UTF-8 将适用于所有情况。

于 2008-12-05T09:16:24.407 回答
0

我还没试过3.0。但是现在字节序列和字符串之间有更大的区别。后者保存 unicode 代码点,而前者不保存 unicode,而只保存encodedunicode 字符串。哈希对字节序列进行操作。因此,您必须首先对您的(unicode)字符串进行编码,然后才能将它们提供给散列。

于 2008-12-05T08:47:02.063 回答