2008-12-05 18 views
2

J'ai travaillé sur l'obtention d'un module 2.5 porté à 3.0, principalement pour ma propre éducation, quand je suis resté coincé. La classe "Builder" a pour INIT:Problème concernant le module "hashlib" de la version 3.0

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

Mais l'erreur se produit à:

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

qui a pour retraçage:

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 

J'ai passez par 2to3, mais ça ne va pas. Pour autant que je sache, la fonction de mise à jour s'attend à ce que l'argument soit sous la forme d'octets/buffer, mais j'ai essayé plusieurs méthodes différentes pour le convertir et n'ai pas réussi.

Comme toujours, toute aide serait grandement appréciée. :)

Répondre

4

Je suppose que cette ligne:

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

devrait devenir:

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

L'encodage désiré réel pourrait être différent dans votre cas, mais UTF-8 fonctionnera dans tous les cas.

+0

Vous avez corrigé cette erreur avec succès et vous avez approfondi cette tâche. Je te félicite et je te remercie! –

0

Je n'ai pas encore essayé 3.0. Mais il y a maintenant une plus grande distinction entre une séquence d'octets et de chaînes. Ces derniers contiennent des points de code Unicode alors que les premiers ne contiennent pas unicode, mais seulement des chaînes Unicode encoded. Les hachages fonctionnent sur des séquences d'octets. Donc, vous devrez encoder vos cordes (unicode) d'abord bevore les nourrir à un hachage.