Python:为什么可以';我不能在列表上迭代吗?我的特例课坏了吗?

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

我已经看过这个问题了:

但是这对我没有帮助,因为我想迭代错误的一个属性,它是一个列表(即,已经是iterable),而不必显式地使用该属性。我希望这样做:

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