0

Python クライアント ライブラリを使用してDiscogs APIにアクセスしようとしています。

以下は、Discogs API を操作する試みの最小限の例です。

from SensitiveInformation.discogs_application_info import provide_discogs_auth, provide_verifier
import discogs_client

discogs_consumer_key, discogs_consumer_secret = provide_discogs_auth()
discogs = discogs_client.Client(user_agent="ThoughfulMachineLearning",
                                consumer_key=discogs_consumer_key,
                          consumer_secret=discogs_consumer_secret)
discogs_auth_url = discogs.get_authorize_url()
discogs.get_access_token(verifier=provide_verifier())
discogs.identity()

関数provide_discogs_authprovide_verifierは、ユーザー認証からコンシューマー キーとシークレット、および検証者を返すだけです。get_access_token期待どおりにアクセスキーとシークレットを返します。

ただし、最後の行で API 呼び出しを行うと、次のようになります。

Out[38]: In[39]: discogs.identity()
Traceback (most recent call last):
Out[39]:   File "/usr/local/lib/python3.4/dist-packages/IPython/core/formatters.py", line 219, in catch_format_error
    r = method(self, *args, **kwargs)
  File "/usr/local/lib/python3.4/dist-packages/IPython/core/formatters.py", line 690, in __call__
    printer.pretty(obj)
  File "/usr/local/lib/python3.4/dist-packages/IPython/lib/pretty.py", line 407, in pretty
    return _default_pprint(obj, self, cycle)
  File "/usr/local/lib/python3.4/dist-packages/IPython/lib/pretty.py", line 527, in _default_pprint
    _repr_pprint(obj, p, cycle)
  File "/usr/local/lib/python3.4/dist-packages/IPython/lib/pretty.py", line 709, in _repr_pprint
    output = repr(obj)
TypeError: __repr__ returned non-string (type bytes)

これが IPython に関連しているのか、クライアント ライブラリに関連しているのかはわかりませんが、どちらの方法でも助けていただければ幸いです。ありがとう。

4

1 に答える 1

2

これはライブラリのバグです。このUser.__repr__メソッドは、Python 3 でバイトを返します。

def __repr__(self):
    return '<User {0!r} {1!r}>'.format(self.id, self.username).encode('utf-8')

あなたはすでにプロジェクトにバグ レポートを提出しています。これはすばらしいことです。

discogs.identity()の結果を変数に代入することで、IPython またはその他のインタラクティブな Python コンソールで見られる問題を回避できます。

user = discogs.identity()

結果をエコーし​​ないようにしてください。

次の方法で、その場でメソッドにパッチを適用できます。

import six
from discogs_client import models

orig_repr = models.User.__repr__

def fixed_repr(self):
    r = orig_repr(self)
    if six.PY3 and isinstance(r, bytes):
        r = r.decode('utf8')
    return r

models.User.__repr__ = fixed_repr

おそらく他のモデルでもこれを行う必要があります。モジュール内の呼び出しを含む__repr__実装が増えています。.encode('utf8')models

于 2015-06-03T16:51:00.183 に答える