【问题标题】:No overload variant of "next" matches argument type List[Scene]“next”的重载变体不匹配参数类型 List[Scene]
【发布时间】:2021-07-11 03:40:26
【问题描述】:

当我尝试检查以下代码时,我收到了这个 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-3.x mypy


    【解决方案1】:

    如果您尝试编写 Python 迭代器,则需要提供某些“神奇”的 dunder 函数,例如 __iter__()__next__()。这些函数是那些可以迭代类的东西调用的函数。

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

    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 类提供了这一点(我们无法确定没有源代码),您可能认为您正在使用以下代码迭代列表,但你不是:

    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,以便更好地区分它们。

    【讨论】:

    • 但我正在定义List[Scene]。那不应该有 __next__ 吗?我也试过SequenceIterable。但那些会产生同样的错误。
    • @Pritam:您必须检查List 的源代码,这不是标准的Python。但是,您应该记住,集合与集合上的迭代器相同。有关详细信息,请参阅我的答案的最后部分。
    猜你喜欢
    • 2021-05-31
    • 1970-01-01
    • 2023-03-06
    • 2021-07-04
    • 2021-12-10
    • 2021-10-24
    • 2022-11-05
    • 2021-11-05
    • 2020-08-26
    相关资源
    最近更新 更多