Python:为什么可以';我不能在列表上迭代吗?我的特例课坏了吗?
我已经看过这个问题了: 但是这对我没有帮助,因为我想迭代错误的一个属性,它是一个列表(即,已经是iterable),而不必显式地使用该属性。我希望这样做:Python:为什么可以';我不能在列表上迭代吗?我的特例课坏了吗?,python,exception-handling,iterator,exception,Python,Exception Handling,Iterator,Exception,我已经看过这个问题了: 但是这对我没有帮助,因为我想迭代错误的一个属性,它是一个列表(即,已经是iterable),而不必显式地使用该属性。我希望这样做: class SCE(Exception): """ An error while performing SCE functions. """ def __init__(self, value=None): """ Message: A string message or an i
class SCE(Exception):
"""
An error while performing SCE functions.
"""
def __init__(self, value=None):
"""
Message: A string message or an iterable of strings.
"""
if value is None:
self._values = ['A general SCE error has occured.']
elif isinstance(value, str):
self._values = [value]
else:
self._values = list(value)
def __iter__(self):
return self._values
def __repr__(self):
return repr(self._values)
然而,在shell中,我得到了以下信息:
try:
raise CSE(['error one', 'error two'])
except CSE, e:
for i in e:
print(i)
Traceback (most recent call last):
File "(stdin)", line 1, in (module)
TypeError: iter() returned non-iterator of type 'list'
我知道我可以删除from_值,然后迭代e.values,但我不想这样做,因为它公开了我的异常类的实现。该方法应该返回一个迭代器对象,但您返回的是一个列表对象。使用
def __iter__(self):
return iter(self._values)
而是要解决这个问题。从对象的文档中(我的突出显示):
当容器需要迭代器时,调用此方法。此方法应返回一个新的迭代器对象,该对象可以迭代容器中的所有对象
\uuu iter\uuu
需要返回迭代器,而不是列表
试试这个:
def __iter__(self):
return iter(self._values)
你也可以这样做:
def __iter__(self):
for val in self._values:
yield val
但是我真的想不出为什么你需要这样做,而不是使用iter()
或更通用的:
def __iter__(self):
for x in self._values:
yield x
谢谢Torsten Marek。我将在下面粘贴我的新版本。实际上,它不是更通用的,是吗?:)嗯,不管怎样,它都不会消失。:)啊,谢谢。你的第二个版本也帮助我更好地理解。第二个版本不是发电机吗?它的性能与第一个版本不同吗?@orokusaki:它确实是一个发电机。我希望它会慢一点,但我还没有测试过。重要的区别在于,在生成x之前,可以对x进行操作。
def __iter__(self):
for x in self._values:
yield x