### “在赋值之前引用了局部变量 ‘e'” 这个错误是什么意思?我该如何修复这个错误?

我正在尝试使用 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 年就已经不存在了。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注