Python 3.x與Python 2.x之間存在著較多的語法細節差異。今天在看Python核心程式設計的時候,說到了自定義迭代器物件。於是動手將原始碼打了一遍,原書程式碼如下:
class AnyIter(object): def __init__(self, data, safe=False): """ The initialization of iterators """ self.safe = safe self.iter = iter(data) def __iter__(self): """ return a iterator """ return self def next(self, count=1): """ Return arbitrary numbers of elements """ retval = [] for item in range(count): try: retval.append(self.iter.next()) except StopIteration: if self.safe: break else: raise # reraise the exception again return retval if __name__ == '__main__': a = AnyIter(range(10), True) b = iter(a) for item in range(1,5): print('{}:{}'.format(item, a.next(item)))
我機器上裝的是Python 3.3.2,在控制檯執行該指令碼的時候直接丟擲異常TypeError:
說是iter()返回的是一個非迭代器型別的物件。前後對照了一下,並沒有發現哪裡有錯誤啊。於是嘗試使用Ipython(Python 版本是2.7.5)來執行該程式碼,得出完美結果。於是考慮是不是版本的問題。求助google,在stackoverflow上找到一個帖子,找到了關鍵原因:
於是將上述程式碼中呼叫next()的地方全部替換為__next__(),最後在控制檯執行該程式碼,正確得到了預期的結果:
查閱Python 3.3.2 附帶的使用者手冊,果然得到如下結果:
問題得到解決:Python核心程式設計使用的是Python 2.x,版本差異使得該狀況得以發生。還是得動手,不然這樣的差異無法得知。