这是我的情况:
我有一个 list/set(哪个无关紧要)movieplayer 对象,我想调用一个 “preload” 函数在。此预加载函数可以立即返回,但希望在将来返回一点。
我要存储这个movieplayer的集合,说明还没有预加载,然后循环遍历,调用preload函数。 preload 函数在返回时会将它们从集合中移除(因此我会知道它们何时都已预加载)。
但是,我认为因为 python 正在等待 preload 函数,然后删除播放器,所以我得到了一个 set size changed during iteration 错误。
嘿,这是我的代码的简化版本,我希望能找到解决此问题的方法。
a = set([mp1, mp2 mp3])
for player in a:
preload(player)
# preload would be something like
def preload(player):
player.preloadVideo()
a.remove(player)
# This is where I believe the error gets generated.
我能想到的唯一解决方案是制作一个 set a 的copy,然后遍历它,但我不确定这是否是正确的方法或什至会起作用。
请您参考如下方法:
您可以通过迭代集合的副本来修复它。我在这里使用了 list():
a = set(['mp1', 'mp2', 'mp3'])
# preload would be something like
def preload(player):
player.preloadVideo()
a.remove(player)
for player in list(a):
preload(player) # N.B. pass player, not a
然而,这并不是一个好的设计。一方面,全局变量 a 是从 preload() 函数中引用的。此外,for 循环遍历集合中的所有元素,依次将每个元素传递给 preload(),因此没有必要检查 中每个 。最后,player 的成员资格一个preload() 应该执行预加载播放器所需的一切,但它不应该负责维护外部数据结构 (a)。
更好的设计是让 preload() 返回一个 bool 值,指示预加载是否成功。然后可以在预加载函数之外删除成功加载的播放器:
a = set(['mp1', 'mp2', 'mp3'])
# preload would be something like
def preload(player):
return player.preloadVideo() # assume that this returns boolean
for player in list(a):
if preload(player):
a.remove(player)
if len(a):
print "{} player(s) failed to preload: {}".format(len(a), a)
else:
print "All players successfully preloaded"
此代码只会在成功预加载后删除播放器。
