2010-04-08 9 views
2

일부 사이트를 선반에 넣으려고하는데 선반이 사이트 개체를 허용하지 않습니다. 그것은리스트, 문자열, 튜플을 받아 들일 것입니다.하지만 사이트 객체를 넣자 마자 선반의 내용을 가져 오려고하면 충돌이 발생합니다.shelve 이상한 오류가 발생합니다.

그래서이 선반을 채울 때 :

def add_to_shelve(self, site): 
    db = shelve.open("database") 
    print site, site.url 
    for word in site.content: 
     db[word] = site.url #site.url is a string, word has to be one too 

shelve.open("database")['whatever'] 완벽하게 작동합니다.

하지만이 할 경우이 오류 메시지와 함께

def add_to_shelve(self, site): 
    db = shelve.open("database") 
    print site, site.url 
    for word in site.content: 
     db[word] = site #site is now an object of Site 

shelve.open("database")['whatever'] 오류를 :

AttributeError: 'module' object has no attribute 'Site' 

나는 완전히 난처한 상황에 빠진거야, 그리고 pythondocs은 이상하게 많은 정보를 가지고 있지 않습니다 어느 한 쪽. 그들이 말하는 것은 선반에있는 키는 문자열이어야하지만 값이나 데이터는 "임의의 객체"일 수 있습니다.

답변

5

쉘브에 객체를 저장 한 후 코드를 리팩토링 한 것처럼 보입니다. 쉘브에서 객체를 가져올 때, 파이썬은 객체를 다시 빌드하고 아마도 이동 한 원래의 클래스를 찾아야합니다. 이 문제는 pickle (shelve 모듈 에서처럼) 작업시 일반적입니다.

pduel이 제시 한 것처럼 해결책은 pickle이 찾을 수 있도록 이전과 동일한 위치에있는 클래스에 대한 하위 호환성 참조를 제공하는 것입니다. 모든 객체를 다시 저장하여 피클을 다시 작성하면 해당 후방 호환 가능 레퍼 런스를 제거 할 수 있습니다.

0

파이썬이 '사이트'객체에 대한 생성자를 찾고있는 것처럼 보입니다. 그것을 발견. 나는 선반을 사용하지 않았지만 절임 될 수있는 것에 대한 규칙은 비잔틴이고 선반 규칙은 유사하다고 의심한다. 라인을 추가

보십시오 : 당신이 unshelving 시도하기 전에 ('사이트'를 제공하는 모듈의 이름)

사이트 =

sitemodule.Site

. 이렇게하면 Site 클래스를 찾을 수 있습니다.

관련 문제