"/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。
答案 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__
的作者没有实现这一点,除了以下内容之外,你无能为力:
urlopen
声明。contextlib.closing
(感谢在下面的评论中提供此解决方案的@vaultah)。它自动为任何对象实现上下文管理器,从而允许您使用with...as
语句。如何实施上下文管理器?
您可以通过为对象/类定义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)