이 문서 내용은 좀 낡았습니다.
60일이나 편집 안된 오래된 망한 문서니 개발 문서인 경우 참고할 때 조심하세요. 최신 정보를 알고 싶으면 게시판에 글 써주세요
코드를 짜다보니 이론적으로만 들었던 문제 상황을 실제로 만나게 되서 동일 사례 방지 겸사 문서를 작성하게 되었다
2. 뭐가 문제였나? ✎ ⊖
def do_inter_render(self, data, doc_include):
doc_set = self.doc_set
doc_set['doc_include'] = doc_include
data_end = class_do_render_namumark(self.curs, self.doc_name, data, doc_set, self.lang_data, do_type = 'inter')()
여기서 doc_set = self.doc_set 부분이 버그의 원인이 되었다
의도는 함수로 전달하기 전에 dict 요소 안의 doc_include를 파라미터의 doc_include로 변경하려고 했으나
doc_set이 self.doc_set의 얕은 복사되버리는 바람에 self.doc_set의 요소도 같이 변경되고 말았다(...)
이렇게 되어버리는 바람에 렌더링 전체 doc_set이 동일하게 되어버려서 발생한 문제였다
3. 문제의 해결 ✎ ⊖
doc_set = dict(self.doc_set)
그냥 깊은 복사하면 된다
사실 이론적으로도 이미 알고 굉장히 간단한 문제인데 이상하게 짜다보면 생각이 잘 안난다...
방어적 프로그래밍이 부족했던 것 같다