Python ChainMap을 활용한 dictionary linking

호두마리·2023년 3월 1일
1

Python Tips

목록 보기
3/3
post-thumbnail

ChainMap??

파이썬 프로그래밍을 하다 보면 여러가지 객체의 데이터를 하나로 합쳐서 처리해야 하는 경우가 생길 수 있다. 나는 이 경우 각 객체를 순환하면서 새로운 통합 딕셔너리에 업데이트하여 처리하였다. 하지만 이렇게 처리하였을 때 Multi threading 환경에서 race condition이 발생될 수 있으며, 관리해야 할 객체가 늘어나게 되었다. 또한, 키값이 동일한 경우 값이 덮어쓰기된다.

ChainMap은 Python 여러가지 컨텍스트를 관리하기 위해 3.3버전에서 collections 모듈에 추가된 기능으로, 다수의 dictionary를 비롯한 여러가지 객체를 논리적으로 맵핑 및 그룹화하여 하나로 동작하게 되어 원본 객체 데이터의 view를 생성한다.
즉, ChainMap으로 생성한 데이터는 원본데이터를 가지고 신규로 생성한 데이터를 갖는것이 아닌, 원본데이터를 보여줄 수 있도록 참조하는 것이며, 원본데이터가 변경되는 경우 ChainMap 객체에서 표시되는 데이터는 변경된 원본데이터를 계속해서 참조하기 때문에 동일하게 변경되는 것 처럼 보이게 된다.

Chrateristics

  • 내부적으로 관리되는 mapping 목록을 통해 원본 객체에 접근할 수 있다. maps method를 활용하여 접근할 수 있으며, 각 mapping 목록을 list로 반환하므로, list index로 원본 객체에 접근할 수 있다.

  • 정의된 dictionary를 통합하여 검색할 수 있으며, 같은 key가 존재하는 경우 첫번째 mapping list의 객체의 key값이 반환된다.

  • 원본데이터를 참조할 뿐, 신규 객체를 생성하는 것이 아니다. 원본 데이터가 변경되면 chain map 객체가 보여주는 데이터(view)도 변경된 원본데이터를 그대로 보여준다.

Applications

테스트용 객체 생성

  • Model 객체를 3개 생성 (model-0, model-1, model-2)
  • 각 객체는 lastvalues attribute(3*2 array)를 가지고 있음
  • 다수의 Model 객체의 lastvalues가 업데이트될 때마다 통합 객체에 반영될 수 있도록 함

객체 lastvalues 데이터 업데이트

  • update시 마다 데이터를 push하고 마지막 데이터를 임의 값으로 업데이트
  • 한번더 실행

ChainMap 객체 생성

원본 객체 업데이트에 따른 ChainMap 객체 view 확인

  • 원본 객체 업데이트 결과에 따라 ChainMap 객체도 동일한 값을 보여준다.

profile
자고싶당

0개의 댓글

관련 채용 정보