Python:为什么我不能遍历列表?我的异常课程是否被禁止?

oro*_*aki 6 python iterator exception-handling exception

我已经看过这个问题:Python迭代器 - 如何在新的样式类中动态分配self.next?

但这对我没有帮助,因为我想迭代一个列表的错误属性(即已经可迭代)而不必明确使用该属性.我希望这样做:

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)
Run Code Online (Sandbox Code Playgroud)

但是,在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'
Run Code Online (Sandbox Code Playgroud)

我知道我可以从_values中删除_然后迭代e.values但我不想这样做,因为它暴露了我的Exception类的实现.

Tor*_*rek 21

__iter__方法应该返回一个迭代器对象,但是您将返回一个列表对象.使用

def __iter__(self):
    return iter(self._values)
Run Code Online (Sandbox Code Playgroud)

而是解决这个问题.从object.__iter__(我突出显示)的文档:

当容器需要迭代器时,将调用此方法.此方法应返回一个新的迭代器对象,该对象可以迭代容器中的所有对象.


Len*_*bro 5

def __iter__(self):
    return iter(self._values)
Run Code Online (Sandbox Code Playgroud)

或更通用的:

def __iter__(self):
    for x in self._values:
        yield x
Run Code Online (Sandbox Code Playgroud)