이 문서 내용은 좀 낡았습니다.
60일이나 편집 안된 오래된 망한 문서니 개발 문서인 경우 참고할 때 조심하세요. 최신 정보를 알고 싶으면 게시판에 글 써주세요


목차

1. 개요
2. 뭐가 문제였나?
3. 문제의 해결

1. 개요

코드를 짜다보니 이론적으로만 들었던 문제 상황을 실제로 만나게 되서 동일 사례 방지 겸사 문서를 작성하게 되었다

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)


그냥 깊은 복사하면 된다

사실 이론적으로도 이미 알고 굉장히 간단한 문제인데 이상하게 짜다보면 생각이 잘 안난다...

방어적 프로그래밍이 부족했던 것 같다