표준 라이브러리에서 제공하는 매핑형은 모두 가변형이지만, 사용자의 실수로 매핑을 변경하지 못하도록 할 때, missing()메서드에서 Pingo.io 프로젝트를 설명할 때 물리적인 범용입출력(GPIO) 핀을 나타내는 board.pins라는 불변형 매핑을 사용하는 구체적인 사례를 볼 수 있다.
하드웨어를 소프트웨어로 변경할 수 없기에 물리적인 디바이스 특성을 반영해서 사용자가 실수로 board.pins를 변경하지 못하도록 막는 것이 좋습니다.
types모듈은 MappingProxyType라는 래퍼 클래스를 제공해서, 원래 매핑의 동적인 뷰를 제공하지만 읽기 전용의 mappoingproxy객체를 반환하는데. 원래 매핑을 변경하면 mappingproxy에 반영되지만 직접 변경을 할 순 없다.
from types import MappingProxyType
d = {1:'A'}
d_proxy = MappingProxyType(d)
d_proxy # mapping({1:'A'})
d_proxy[1] # 'A'
d_proxy[2] = 'x'
d[2] = 'B'
d_proxy # mappingproxy({1:'A', 2:'B'})
d_proxy[2] # B
Pingo.io에서 Board 서브클래스의 생성자가 pin 객체로 내부 매핑을 채우고, mappingproxy로 구현한 pins 속성을 공개해서 API 사용자에게 제공함으로써 불변형 매핑을 사용할 수도 있고, 클라이언트가 실수로 핀을 추가,삭제,변경할 수 없게 된다.