views:

270

answers:

2

I've been working on getting a 2.5 module ported to 3.0, mostly for my own education, when I've gotten stuck. The class "Builder" has as its init:

def __init__(self, **options):
    self._verifyOptions(options)
    self._options = options
    self._initDigest()
    self._initBuildNames()
    self._methods = []

But the error occurs at:

def _initDigest(self):
    import os, sys, hashlib
    digester = hashlib.md5()
    digester.update(self._options.get('code'))
    self._digest = digester.hexdigest()

which has as its traceback:

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

I've run it through 2to3, but it isn't picking up on it. As far as I can tell, the update function is expecting the argument to be in the form of bytes/buffer, but I've tried several different methods to convert it and haven't succeeded.

As always, any assistance would be greatly appreciated. :)

A: 

I havent tried 3.0 yet. But there is now a bigger distinction between a sequence of bytes and strings. The latter hold unicode codepoints while the former don't hold unicode but only encoded unicode strings. Hashes operate on sequences of bytes. So you will have to encode your (unicode) strings first bevore feeding them to a hash.

unbeknown
+2  A: 

I'm guessing that this line:

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

should become:

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

The actual desired encoding could be different in your case, but UTF-8 will work in all cases.

ΤΖΩΤΖΙΟΥ
You have successfully corrected this error, and educated me further upon this task. I congratulate and thank you!
J.T. Hurley