Pregunta

He estado trabajando para obtener un módulo 2.5 portado a 3.0, principalmente para mi propia educación, cuando me he quedado atascado. La clase " Constructor " tiene como init:

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

Pero el error ocurre en:

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

que tiene como rastreo:

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

Lo ejecuté a través de 2to3, pero no se está dando cuenta. Por lo que puedo decir, la función de actualización espera que el argumento tenga la forma de bytes / búfer, pero he intentado varios métodos diferentes para convertirlo y no he tenido éxito.

Como siempre, cualquier ayuda sería muy apreciada. :)

¿Fue útil?

Solución

Supongo que esta línea:

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

debería convertirse en:

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

La codificación deseada real podría ser diferente en su caso, pero UTF-8 funcionará en todos los casos.

Otros consejos

Todavía no he probado 3.0. Pero ahora hay una mayor distinción entre una secuencia de bytes y cadenas. Los últimos contienen puntos de código unicode, mientras que los primeros no contienen unicode sino solo cadenas unicode codificadas . Los hashes operan en secuencias de bytes. Por lo tanto, primero deberá codificar sus cadenas (unicode) antes de alimentarlas a un hash.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top