Pergunta

Eu tenho trabalhado em obter um módulo de 2,5 portado para 3,0, principalmente para minha própria educação, quando eu comecei preso. A classe "Builder" tem como inicialização:

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

Mas o erro ocorre em:

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

que tem como 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

Eu executá-lo através 2to3, mas não está pegando nele. Tanto quanto eu posso dizer, a função de atualização está esperando o argumento de ser na forma de bytes / buffer, mas eu tentei vários métodos diferentes para convertê-lo e não conseguiram.

Como sempre, qualquer ajuda seria muito apreciada. :)

Foi útil?

Solução

Eu estou supondo que esta linha:

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

deve tornar-se:

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

A codificação real desejado poderia ser diferente no seu caso, mas UTF-8 vai funcionar em todos os casos.

Outras dicas

Eu não tentei 3.0 ainda. Mas agora há uma maior distinção entre uma sequência de bytes e strings. Os últimos codepoints espera unicode Enquanto o primeiro não possuem unicode, mas strings unicode única encoded. Hash operar em sequências de bytes. Assim você terá para codificar suas cordas (unicode) primeiro bevore alimentá-los para um hash.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top