2012-09-11 3 views
0

내 프로그램에 일부 지속성을 추가하기 위해 쉘브 모듈을 사용하고 있습니다. 처음에 나는이 선반의 기본 bsddb 데이타를 사용했지만, 난이 다음 함수로 변경했고, 그 후 예외를 변경하면 발생합니다 것 같다예외 파이썬 2.6에서 쉘브 모듈을 사용하는 동안 RuntimeError

Exception RuntimeError: 'maximum recursion depth exceeded in __subclasscheck__' in <type  'exceptions.AttributeError'> ignored 

어떤 whichdb 호출하여 anydbm 모듈에서 제기 된 (그리고 잡힐) 수 .

아무런 문제가 없으며 문제없이 코드가 완료되지만 다소 좋지 않습니다. 지금까지 내가 경고 모듈을 사용하여 인쇄를 억제 할 수 있다는 것을 알고 있지만, 예외를 완전히 제거하고 싶습니다.

다른 장소 (그들은 pylint, django 및 다른 모듈/패키지에서 발생 함)에서 비슷한 문제를 겪고 있었으며 어디서나 "버그"로 표시되는 것으로 보입니다. 누군가가 anydbm/shelve 모듈에서 이러한 동작에 대한 해결책을 찾았습니까?

edit1. 데프 getattr (자기, ATTR) : 반환 getattr (self.config, ATTR)

나는 선반에 다른를 래핑하는 클래스를 저장하기 위해 노력하고있어 는이 오류를 일으키는 일이 있음을 발견 클래스 - 그 이유는 getattr 함수가 재정의됩니다. 그것을 작성하고 무한 루프를 얻을 수있는 방법이 있습니까?

+0

(이처럼 보이는)이 도서관에서 이런 경우를, 그것은 저자가 알려주는 가치가있다. 버그 일 수 있겠지? 즉 재귀 한계가 결코 충족되지 않는다는 것을 완전히 확신하지 않고 파이썬에서 재귀를 구현해서는 안됩니다. –

+0

그래, 그건 사실이야. 나는 아직도이 버그를 해결할 방법을 찾고있다. RuntimeError 예외 인쇄를 억제 할 수 있는지 알고 계십니까? warnings 모듈이 작동하지 않습니다 (경고가 아니기 때문에 예외 임). 그리고 저는 여기 꽤 당황합니다. 나는 프로그램의 사용자가 제품을 출시 할 때마다 예외를보고 싶어한다고 생각하지 않는다. – p4r4noj4

답변

1

좋아, 문제를 해결할 수 있었다고 생각합니다. 문제는 래퍼 클래스가 setstategetstate 함수를 가지지 않았 음을 나타냅니다. 지금까지는 효과가있는 것 같습니다. 래핑 된 클래스는 설정 상태getstate이 필요하지 않습니다.

내가 래퍼 클래스에 대한 간단한 다시 GetState와 setState를 기능 사용 :

def __getstate__(self): 
     ''' 
     Getstate for pickle (used by shelve module) 
     ''' 
     return self.__dict__ 

    def __setstate__(self, dictionary): 
     ''' 
     Setstate for pickle (used by shelve module) 
     ''' 
     self.__dict__ = dictionary 
관련 문제