"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
以更好地区分它们。
我在尝试检查以下代码时遇到此 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
以更好地区分它们。