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 回答