2010-10-26 37 views
6

Mục tiêu của chương trình sau đây là tìm hiểu về các trình tạo python và thực thi trình lặp để hiểu các phương thức ma thuật Python.Thực hiện chức năng iteritems cho trình vòng lặp tùy chỉnh của tôi?

Tôi đang gặp sự cố khi triển khai chức năng iteritems(). Ngoài ra, tôi muốn biết liệu tôi có đi đúng hướng hay tôi không hiểu sai về phương pháp ma thuật python.

import random 

class Random(object): 
    """ generate randomised int of specified length --> [r1, r2, r3....] """ 

    def __init__(self, length = 1, rand_range = 100): 
     self.index = 0 
     self.generated_range = [] 
     self.length = length if str(length).isdigit() else 1 
     self.rand_range = rand_range if str(rand_range).isdigit() else 100 

    def __iter__(self): return self 

    def next(self): 
     if self.index < self.length: 
      item = random.randrange(0, self.rand_range) 
      self.generated_range.append(item) 
      self.index += 1 
      return item 
     raise StopIteration 

    def __eq__(self, obj): 
     if self.length == obj.length and self.rand_range == obj.rand_range: 
      return True 
     return False 

    def __len__(self): 
     return self.length 

    def __contains__(self, item): 
     if not self.index == self.length: 
      while self.next(): continue 
     if item in self.generated_range: 
      return True 
     return False 

    def __getitem__(self, key): 
     if key in self.generated_range: 
      return key * 100 
     raise KeyError 

    def __setitem__(self, key, value): 
     raise NotImplemented 

    def __delitem__(self, key): 
     raise NotImplemented 

    def iteritems(self): 
     if not self.index == self.length: 
      while self.next(): continue 
     for item in self.generated_range: 
      yield item 

if __name__ == '__main__': 
    r1 = Random(10) 
    print [ r for r in r1] 
    print 10 in r1 
    r2 = Random(20) 
    print r2.iteritems() 

Trả lời

4

iteritems có nghĩa vụ phải trả lại một chuỗi các (key, val) cặp cho một cuốn từ điển, vì vậy tôi không nghĩ rằng nó thích hợp cho lớp học của bạn. Nếu bạn tạo ra một hậu duệ của UserDict, thì có thể có một trường hợp để ghi đè nó.

Nếu bạn ghi đè lên iteritems, bạn nên làm như vậy bằng cách cho ra cặp khóa, giá trị.

Ghi đè của người lập trình kém:

def iteritems(self): 
    return iter([(x[0], x) for x in "alpha bravo charlie".split()]) 
Các vấn đề liên quan