2009-09-22 4 views
0

여기에 옳은 일을하고 있는지 나는 모른다. 기본적으로 두 클래스 모두 json-serializable이되기를 바란다. 문제의Json 인코더 파이썬 재귀 참조

import json 

class gpagelet(json.JSONEncoder): 
    """ 
    Holds 1) the pagelet xpath, which is a string 
      2) the list of pagelet shingles, list 
    """ 
    def __init__(self, parent): 
     if not isinstance(parent, gwebpage): 
      raise Exception("Parent must be an instance of gwebpage") 
     self.parent = parent # This must be a gwebpage instance 
     self.xpath = None  # This is just an id for the pagelet (not unique across page), historically called xpath 
     self.visibleShingles = [] 
     self.invisibleShingles = [] 
     self.urls = [] 


    def __str__(self): 
     """String representation of this object""" 
     ret = "" 
     ret += "xpath: %s\n" % self.xpath 

     def appendShingles(): 
      ret += "shingles: \n" 
      for each in self.shingles: 
       ret += "%s\n" % str(each) 

     ret += "urls:\n" 
     for each in self.urls: 
      ret += "%s\n" % str(each) 
     return ret 





class gwebpage(json.JSONEncoder): 
    """ 
    Holds all the datastructure after the results have been parsed 
    holds: 1) lists of gpagelets 
      2) loc, string, location of the file that represents it 
    """ 
    def __init__(self, url): 
     self.url = url    # This will be http:// 
     self.netloc = False   # This will be http:// too 
     self.gpagelets = [] 
     # Appended by functions 
     self.page_key = "" 


    def __str__(self): 
     ret = "" 
     ret += "url: %s\n" % self.url 
     ret += "netloc: %s\n" % self.netloc 
     ret += "page_key: %s\n" % self.page_key 
     ret += "pagelets:\n" 
     for each in self.gpagelets: 
      ret += "%s\n" % each.__str__() 
     return ret 


class GpageletEncoder(json.JSONEncoder): 

    def default(self, gp): 
     gwebpageEncoder = GwebpageEncoder() 
     if not isinstance(gp, gpagelet): 
      raise Exception("Cannot use GpageletEncoder on a non gpagelet instance") 
     u = { } 
     u['parent'] = gwebpageEncoder.default(gp.parent) 
     u['xpath'] = gp.xpath 
     u['visibleShingles'] = gp.visibleShingles 
     u['invisibleShingles'] = gp.invisibleShingles 
     u['urls'] = gp.urls 
     return u 




class GwebpageEncoder(json.JSONEncoder): 


    def default(self, gw): 
     gpageletEncoder = GpageletEncoder() 
     if not isinstance(gw, gwebpage): 
      raise Exception("Cannot use gwebpageEncoder on a non gwebpage instance") 
     u = { } 
     u['url'] = gw.url 
     u['netloc'] = gw.netloc 
     u['gpagelets'] = [ gpageletEncoder.default(each) for each in gw.gpagelets ] 
     u['page_key'] = gw.page_key 
     return u 





if __name__ == "__main__": 

    import simplejson 
    mom = gwebpage('http://www.google.com') 
    son = gpagelet(mom) 
    mom.gpagelets.append(son) 
    print simplejson.dumps(mom, cls=GwebpageEncoder) 

하나는 1) 내가 GWebpage의 기본은 기본 또는 인코딩 gwebpage을 반환 가정 유무를 알 수없는) 2를 할 생각 무엇 기본 모르겠입니다

이제 무한 재귀가 발생합니다.

누군가 도움을 줄 수 있습니까? 참고로

답변

0

나는이 함께 문제를 많이보고 있어요 : 유 [ 'gpagelets'] =을

[gpageletEncoder.default (각) gw.gpagelets에서 각]