Python:为什么我不能遍历一个列表?我的特例课有问题吗?

2024-05-29 06:45:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经看过这个问题了:Python iterators – how to dynamically assign self.next within a new style class?

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

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)

然而,在外壳里我得到了:

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'

我知道我可以从值中删除,然后遍历e.values,但我不想这样做,因为它公开了我的异常类的实现。


Tags: ofselfnonereturn属性valuedeferror
3条回答

^{}方法应该返回一个迭代器对象,但您返回的是一个列表对象。使用

def __iter__(self):
    return iter(self._values)

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

This method is called when an iterator is required for a container. This method should return a new iterator object that can iterate over all the objects in the container.

def __iter__(self):
    return iter(self._values)

或者更通用的:

def __iter__(self):
    for x in self._values:
        yield x

__iter__需要返回一个迭代器,而不是一个列表。

试试这个:

    def __iter__(self):
        return iter(self._values)

你也可以:

    def __iter__(self):
        for val in self._values:
            yield val

但我真的想不出为什么你需要这样做而不是使用iter()

相关问题 更多 >

    热门问题