2016-08-05 34 views
1

Versucht, das untenstehende Programm zusammen mit Werten auszuführen, die es druckt None. Kann mir jemand helfen, warum das Drucken None?Warum wird dieser Code gedruckt?

class Myself(object): 
    def __init__(self): 
     self.record={} 
    def __iter__(self): 
     self._roles = list(self.record.keys()) 
     #print ("in iter self._roles",type(self._roles)) 
     return self 
    def __next__(self): 
     if self._roles: 
      return self._roles.pop() 
     else: 
      StopIteration 

    def __setitem__(self,key,value): 
     self.record[key]=value 
    def __getitem__(self,key): 
     return self.record.get(key,"No record found") 

    def list_all(self): 
     for detail in self.record: 
      print (self.record[detail]) 

def main(): 
    mydetails = Myself() 

    mydetails['name']='Python' 
    mydetails['age']='26' 
    mydetails['job']='software' 
    mydetails.list_all() 

    for x in mydetails: 
     print (x,":",mydetails[x]) 

main() 

Antwort

1

Sie sollten StopIteration erhöhen:

def __next__(self): 
    if self._roles: 
     return self._roles.pop() 
    else: 
     raise StopIteration 
1

Sie müssen raise die StopIteration execption:

def __next__(self): 
    if self._roles: 
     return self._roles.pop() 
    else: 
     raise StopIteration 

, weil Sie nicht raise es, verweisen Sie lediglich den Namen was nichts tut. Dann endet die __next__-Methode gerade, was zu einem Standardwert implizit return None führt.

Verwandte Themen