2010-10-26 14 views
6

पाइथन जादू विधियों को समझने के लिए निम्न प्रोग्राम का उद्देश्य पायथन जेनरेटर और इटरेटर कार्यान्वयन सीखना है।मेरे कस्टम इटरेटर के लिए iteritems फ़ंक्शन को कार्यान्वित करें?

मैं iteritems() फ़ंक्शन को कार्यान्वित कर रहा हूं। साथ ही, मैं जानना चाहता हूं कि मैं सही दिशा में जा रहा हूं या मैं पाइथन जादू विधियों को समझने में अवधारणात्मक रूप से गलत हूं।

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

उत्तर

4

iteritems एक शब्दकोश के लिए (कुंजी, वैल) जोड़े का एक अनुक्रम वापस जाने के लिए माना जाता है, तो मैं इसे अपने वर्ग के लिए उपयुक्त है नहीं लगता। यदि आपने UserDict के वंशज को बनाया है, तो हो सकता है कि इसे ओवरराइड करने का कोई मामला हो।

यदि आप iteritems ओवरराइड करते हैं, तो आपको कुंजी, मूल्य जोड़े प्रदान करके ऐसा करना चाहिए।

गरीब प्रोग्रामर के ओवरराइड:

def iteritems(self): 
    return iter([(x[0], x) for x in "alpha bravo charlie".split()]) 
संबंधित मुद्दे