"next" 的重载变体不匹配参数类型 List[Scene]

No overload variant of "next" matches argument type List[Scene]

我在尝试检查以下代码时遇到此 mypy 错误 No overload variant of "next" matches argument type List[Scene]

class Scene:
    def __init__(self):
        self.a = None
    def something(self):
        self.a = 2

class Game:
    def __init__(self, scenes:List[Scene]) -> None:
        self.scenes = iter(scenes)
        self.current_scene = next(scenes)

我该如何摆脱它?错误来自代码的最后一行。我试过 self.scenes:Iterator = iter(scenes) 但即使这样也无济于事。

如果您正在尝试编写 Python 迭代器,则需要提供某些“神奇”双下划线函数,例如 __iter__()__next__()。这些函数是那些可以迭代 class.

的东西调用的函数

例如,这里有一个 class returns 一个范围内的所有奇数,很像 range() returns 一个范围内的所有数字:

class odd_range(object):
    def __init__(self, first_one, last_plus_one):
        # Ensure start at first odd >= given start, and
        # store terminator for later checking.

        self.__curr = first_one
        if first_one % 2 == 0:
            self.__curr += 1

        self.__term = last_plus_one

    def __iter__(self):
        return self

    def __next__(self):
        # Terminate if range over, otherwise
        # return current, calculate next.

        if self.__curr >= self.__term:
            raise StopIteration()

        cur = self.__curr
        self.__curr += 2
        return cur

然而,即使您的 List class 提供了这一点(没有来源我们无法确定),您可能 认为 您正在使用以下代码遍历列表,但您不是:

def __init__(self, scenes:List[Scene]) -> None:
    self.scenes = iter(scenes)
    self.current_scene = next(scenes)

您创建了一个迭代器 self.scenes 但您调用 next 的东西是 原始 集合 scenes 传递给 __init__()不是迭代器本身。如果你想使用迭代器,那就是:

self.current_scene = next(self.scenes)

尽管您最好使用更具描述性的名称,例如 self.scenes_iterator 以更好地区分它们。