2010-10-26 3 views
6

L'obiettivo del seguente programma è quello di imparare generatori Python e implementazione iteratore al fine di comprendere i metodi di magia Python.Implementare la funzione iteritem per il mio iteratore personalizzato?

Sono bloccato l'attuazione della funzione di iteritems(). Inoltre, voglio sapere se sto andando nella giusta direzione o sono concettualmente sbagliato nella comprensione dei metodi magici di 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() 

risposta

4

iteritems deve restituire una sequenza di coppie (chiave, val) per un dizionario, quindi non credo che sia appropriato per la vostra classe. Se hai creato un discendente di UserDict, potrebbe esserci un caso per sovrascriverlo.

Se lo fai ignorare iteritems, si dovrebbe fare in modo da chiave di rendimento, coppie di valori.

esclusione

Poor programmatore:

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