파이썬 프로그래밍을 하다 보면 여러가지 객체의 데이터를 하나로 합쳐서 처리해야 하는 경우가 생길 수 있다. 나는 이 경우 각 객체를 순환하면서 새로운 통합 딕셔너리에 업데이트하여 처리하였다. 하지만 이렇게 처리하였을 때 Multi threading 환경에서 race condition이 발생될 수 있으며, 관리해야 할 객체가 늘어나게 되었다. 또한, 키값이 동일한 경우 값이 덮어쓰기된다.
ChainMap은 Python 여러가지 컨텍스트를 관리하기 위해 3.3버전에서 collections 모듈에 추가된 기능으로, 다수의 dictionary를 비롯한 여러가지 객체를 논리적으로 맵핑 및 그룹화하여 하나로 동작하게 되어 원본 객체 데이터의 view를 생성한다.
즉, ChainMap으로 생성한 데이터는 원본데이터를 가지고 신규로 생성한 데이터를 갖는것이 아닌, 원본데이터를 보여줄 수 있도록 참조하는 것이며, 원본데이터가 변경되는 경우 ChainMap 객체에서 표시되는 데이터는 변경된 원본데이터를 계속해서 참조하기 때문에 동일하게 변경되는 것 처럼 보이게 된다.
내부적으로 관리되는 mapping 목록을 통해 원본 객체에 접근할 수 있다. maps method를 활용하여 접근할 수 있으며, 각 mapping 목록을 list로 반환하므로, list index로 원본 객체에 접근할 수 있다.
정의된 dictionary를 통합하여 검색할 수 있으며, 같은 key가 존재하는 경우 첫번째 mapping list의 객체의 key값이 반환된다.
원본데이터를 참조할 뿐, 신규 객체를 생성하는 것이 아니다. 원본 데이터가 변경되면 chain map 객체가 보여주는 데이터(view)도 변경된 원본데이터를 그대로 보여준다.