2010-10-26 7 views
6

El objetivo del siguiente programa es aprender generadores python e implementación de iteradores para comprender los métodos mágicos de Python.¿Implementar la función iteritems para mi iterador personalizado?

Estoy atascado implementando la función iteritems(). Además, quiero saber si estoy yendo en la dirección correcta o si estoy conceptualmente equivocado en la comprensión de los métodos de magia de pitón.

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

Respuesta

4

iteritems se supone que devolver una secuencia de pares (clave, val) de un diccionario, por lo que no creo que sea apropiado para su clase. Si creó un descendiente de UserDict, entonces podría haber un caso para anularlo.

Si anula iteritems, debe hacerlo generando pares clave, valor.

anulación

Poor programador:

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