在制作中我有以下代码:
class Data(object):
def __init__(self, data=None):
self._data = data
@property
def is_loaded(self):
return self._data is not None
def main():
d = {0: Data(), 1: Data(1)}
loaded = sum(1 for value in d.itervalues() if value.is_loaded) # RuntimeError
print loaded
非常罕见 - 我估计10K中有1次运行 - 这在sum()
失败了;如果使用相同的输入再次运行,则错误不会重现:
File "module.py", line 12, in main
loaded = sum(1 for value in d.itervalues() if value.is_loaded)
File "module.py", line 12, in <genexpr>
loaded = sum(1 for value in d.itervalues() if value.is_loaded)
RuntimeError: maximum recursion depth exceeded
问题:为什么会发生这种情况,如何重现和调试?很明显,我可以用一个简单的循环重写sum()
,但错误是有趣的......
供参考:服务器运行CentOS 7.2.1511,x64,PyPy 5.1.1(匹配Python 2.7.10),portable build。