2

私は 2.5 モジュールを 3.0 に移植する作業を行っていましたが、これは主に自分自身の教育のために、行き詰まったときです。クラス「ビルダー」には、初期化として次のものがあります。

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 で実行しましたが、うまくいきません。私が知る限り、更新関数は引数がバイト/バッファの形式であることを期待していますが、それを変換するためにいくつかの異なる方法を試しましたが、成功しませんでした.

いつものように、どんな支援も大歓迎です。:)

4

2 に答える 2

4

私はこの行を推測しています:

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

なる必要があります:

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

実際に必要なエンコーディングはケースによって異なる場合がありますが、UTF-8 はすべてのケースで機能します。

于 2008-12-05T09:16:24.407 に答える
0

3.0はまだ試していません。しかし、現在では、一連のバイトと文字列の間に大きな違いがあります。後者は Unicode コードポイントを保持しますが、前者は Unicode を保持せず、Unicode 文字列のみを保持しencodedます。ハッシュは一連のバイトで動作します。そのため、最初に (Unicode) 文字列をエンコードしてからハッシュに渡す必要があります。

于 2008-12-05T08:47:02.063 に答える