gpt4 book ai didi

python - 回溯 : AttributeError:addinfourl instance has no attribute '__exit__'

转载 作者:IT老高 更新时间:2023-10-28 21:14:36 25 4
gpt4 key购买 nike

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)

错误信息:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: addinfourl instance has no attribute '__exit__'

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

系统信息:ubuntu oracle virtual box中的python 2.7。

最佳答案

该错误是由这一行引起的:

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

您不能在 with...as 语句中使用任何随机对象。

有两种方法可以解决这个问题:

解决方案一:使用contextlib.closure:

from contextlib import closing

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

解决方案 2: 不要使用 with...as 语句;而是将值分配给变量:

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

为什么会这样?

您不能在 with ... as 语句中使用任何随机对象。

只有那些具有两个魔术方法的对象才能工作:__enter____exit__ 在它们上实现。这些方法统称为“上下文管理器”。可以在下面找到有关此的介绍性教程。

AttributeError 被引发是因为没有为 urlopen 实现任何上下文管理器(它没有 __enter__ __exit__ 方法)。

这让您有两个选择:

  1. 不要使用 with...as 语句。
  2. 或使用 contextlib.closing (感谢 @vaultah 在下面的评论中提供了此解决方案)。它自动为任何对象实现上下文管理器,从而允许您使用 with...as 语句。

(注意:在 Python 3 中,urlopen 确实有一个上下文管理器,因此可以在 with...as 语句中使用。)


教程:如何实现上下文管理器?

要使对象在 with...as 语句中工作,您首先需要为该对象实现上下文管理器。简单来说,您需要为该对象/类定义 __enter____exit__ 方法。

请阅读 these docs on context managers .

例子:

>>> class Person(object):
"""To implement context manager, just create two methods
__enter__ and __exit__.
"""

def __init__(self, name):
self.name = name

def __enter__(self):
# The value returned by this method is
# assigned to the variable after ``as``
return self

def __exit__(self, exc_type, exc_value, exc_traceback ):
# returns either True or False
# Don't raise any exceptions in this method
return True


>>> with Person("John Doe") as p:
print p.name

>>> "John Doe" #success

关于python - 回溯 : AttributeError:addinfourl instance has no attribute '__exit__' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30627937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com