2010-10-26 19 views
6

Celem poniższego programu jest poznanie generatorów Pythona i implementacja iteratora w celu zrozumienia metod magii Pythona.Zaimplementuj funkcję iteritems dla mojego niestandardowego iteratora?

Utknąłem, wykonując funkcję iteritems(). Ponadto chcę wiedzieć, czy zmierzam w dobrym kierunku, czy też koncepcyjnie nie rozumiem magicznych metod Pythona.

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() 

Odpowiedz

4

iteritems ma powrócić sekwencję (key, val) parami na słowniku, więc nie sądzę, że to odpowiednie dla danej klasy. Jeśli utworzyłeś potomek UserDict, może istnieć przypadek, aby go przesłonić.

Jeśli zastąpisz iteritemy, powinieneś to zrobić, podając klucz, pary wartości.

przesłanianie

Biedna programisty:

def iteritems(self): 
    return iter([(x[0], x) for x in "alpha bravo charlie".split()]) 
Powiązane problemy