代码之家  ›  专栏  ›  技术社区  ›  J.T. Hurley

关于3.0的“hashlib”模块的问题

  •  2
  • J.T. Hurley  · 技术社区  · 17 年前

    当我陷入困境时,我一直在努力将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函数期望参数以字节/缓冲区的形式出现,但我尝试了几种不同的方法来转换它,但都没有成功。

    一如既往,我们将非常感谢您的任何帮助。 :)

    2 回复  |  直到 17 年前
        1
  •  4
  •   tzot    17 年前

    我猜这句话:

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

    应该变成:

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

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

        2
  •  0
  •   unbeknown unbeknown    17 年前

    我还没试过3.0。但现在字节序列和字符串之间有了更大的区别。后者保存unicode代码点,而前者不保存unicode,只保存 encoded unicode字符串。哈希对字节序列进行操作。因此,在将字符串输入哈希之前,您必须先对(unicode)字符串进行编码。