回溯:AttributeError:addinfourl实例没有属性' __退出__'

时间:2015-06-03 18:31:13

标签: python python-2.7

  "/used-products" {
      controller = "product"
      action = "usedProducts"
    }

错误讯息:

from urllib import urlopen
with urlopen('https://www.python.org') as story:
    story_words = []
    for line in story:
        line_words = line.split()
        for words in line_words:
            story_words.append(word)

我不明白上述代码有什么问题以及如何解决?

系统信息:ubuntu oracle虚拟框中的python 2.7。

2 个答案:

答案 0 :(得分:69)

该错误是由此行引起的:

with urlopen('https://www.python.org') as story:

要解决此问题,请使用以下行替换该行:

story = urlopen('https://www.python.org')

有关错误的其他信息

为什么会这样?

要使with ... as语句适用于对象,必须实现该对象的上下文管理器。这意味着对象/类必须为其定义__enter____exit__方法。

AttributeError被引发,因为没有为urlopen实现任何上下文管理器(它没有__enter__和{{1}为它定义的方法)。

由于__exit__的作者没有实现这一点,除了以下内容之外,你无能为力:

  1. 要么不使用urlopen声明。
  2. 或者,如果必须,您可以使用contextlib.closing(感谢在下面的评论中提供此解决方案的@vaultah)。它自动为任何对象实现上下文管理器,从而允许您使用with...as语句。
  3. 如何实施上下文管理器?

    您可以通过为对象/类定义with...as__enter__方法来实现上下文管理器。

    请阅读these docs on context managers

    示例:

    __exit__

    上面,我们得到了一个# example without a context manager # will raise AttributeError >>> class Person(object): def __init__(self, name): self.name = name >>> with Person("John Doe") as p: print p.name >>> AttributeError: __exit__ ,因为我们还没有为AttributeError实现上下文管理器。以下是上下文管理器的实现方式。

    Person

答案 1 :(得分:-1)

您可以在Python 2.7中尝试以下内容:

from urllib import urlopen
story = urlopen('https://www.python.org')
story_words = []
for line in story:
    line_words = line.split()
    for words in line_words:
        story_words.append(words)