我正在尝试使用 del.icio.us API,并按照书籍 《Programming Collective Intelligence》 中的示例进行操作。
当我在 Python 3.6.2 中使用以下命令时:
>>> from deliciousrec import *
>>> delusers=initializeUserDict(‘programming’)
我得到了以下错误:
<urlopen error [Errno 11001] getaddrinfo failed>, 4 tries left. <urlopen error [Errno 11001] getaddrinfo failed>, 3 tries left. <urlopen error [Errno 11001] getaddrinfo failed>, 2 tries left. <urlopen error [Errno 11001] getaddrinfo failed>, 1 tries left. Traceback (most recent call last): File "<stdin>", line 1, in <module> File"C:\Users\user\AppData\Local\Programs\Python\Python36\deliciousrec.py", line 10, in initializeUserDict for p1 in get_popular(tag=tag)[0:count]: File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\pydelicious-0.6-py3.6.egg\pydelicious\__init__.py", line 1042, in get_popular File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\pydelicious-0.6-py3.6.egg\pydelicious\__init__.py", line 1026, in getrss File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\pydelicious-0.6-py3.6.egg\pydelicious\__init__.py", line 455, in dlcs_rss_request File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\pydelicious-0.6-py3.6.egg\pydelicious\__init__.py", line 239, in http_request UnboundLocalError: local variable 'e' referenced before assignment
我无法打开 pydelicious-0.6-py3.6.egg 并访问需要修改的 init 文件。之前有人见过这种类型的错误吗?我该如何解决这个问题?
回答:
这个库的 PyPI 页面 使用的是过去时态:
曾是一个完整的 Python 接口,用于 del.icio.us 书签的 HTTP API。
它的主页是一个 Github 仓库,上面写着:
旧的 pydelicious 工作 (–2010)
自 2010 年以来的唯一更新是:
[2016] del.icio.us 大约自 2009 年起就不存在了,并重定向到 delicious.com。目前在 del.icio.us 又有一个新的登录页面。不确定他们现在在做什么。
即使是 2010 年的旧页面 也说:
重要提示:pydelicious 尚未更新以使用 OAuth 协议。拥有 Yahoo 账户/邮箱的新用户将无法使用此库。
因此,很可能这个库从未更新以支持 Python 3.x,或者更新它所依赖的库的最新版本,或者更新新的 del.icio.us
是什么。
但与此同时,如果你想自己调试它,你可以这样做。
要查看 .egg
归档中的源代码,你可以从 Python 内部进行操作:
>>> import deliciousrec>>> import inspect>>> inspect.getsource(deliciousrec)
… 或者你可以使用你喜欢的 ZIP 文件工具提取 .egg
归档,因为 .egg
文件就是 ZIP 文件。
… 或者你可以直接克隆 GitHub 仓库,或者 在线查看,这可能是最好的解决方案。
正如 Hamms 在评论中指出的,如果你查看 引发错误的函数,它是这样做的:
except urllib2.HTTPError, e: # reraise unexpected protocol errors as PyDeliciousException raise PyDeliciousException, "%s" % e
在 Python 2 中,这意味着处理类型为 urllib2.HTTPError
的异常,并将 e
绑定到函数的其余部分的异常上。
在 Python 2.6 中,这种语法被软废弃,取而代之的是新的语法:
except urllib2.HTTPError as e: # reraise unexpected protocol errors as PyDeliciousException raise PyDeliciousException, "%s" % e
在 Python 3 中,旧的语法完全被废弃,因此现在是非法的。
2to3
工具会自动为你修复这个特定问题,但它可能不会修复所有问题;你需要手动将代码移植到 3.x。当然,这可能没有任何好处,因为你试图调用的 API 在 2010 年就已经不存在了。