dict 형은 애플리케이션에서 널리 사용되고 파이썬에서 핵심 부분이다. 왜냐하면, 모듈 네임스페이스, 클래스 및 인스턴스 속성, 함수의 키워드 인수 등 핵심 부분에 딕셔너리가 사용되고 있고, 내장 함수들은 builtins.dict에 들어 있다.
파이썬 dict 클래스는 해시 테이블이라는 엔진으로 인해서 상당히 최적화가 된 상태이다.
collections.abc 모듈은 dict 및 유사한 자료형의 인터페이스를 정의하기 위해 매핑 및 MutableMapping 추상 베이스 클래스를 제공합니다.
특화된 매핑은 추상 베이스 클래스 대신 dict나 collections.UserDict 클래스를 상속한다.
추상 베이스 클래스는 매핑이 제공해야 하는 최소한의 인터페이스를 정의하고 문서화를 진행하는 것이며 넓은 의미의 매핑을 지원해야 하는 코드에서 isinstance() 테스트 기준
my_dict ={}
import collections
isinstance(my_dict, collections.abs.Mapping) #True
"""
함수 인수가 dict형인지 검사하는 것보다 isinstance() 함수를 사용하는 것이 좋고, 다른 매핑형이 사용될 수 있기 때문이다.
표준 라이브러리에서 제공하는 매핑형은 모두 dict를 이용해서 구현이 되므로 키가 해시 가능해야 한다는 제한을 갖고 있다.(키만 해싱 가능하면 된다.)
"""
해시 가능: 수명 주기 동안 결코 변하지 않는 해시값을 갖고 있고(hash() 메서드가 필요하다) 다른 객체와 비교할 수 있으면(eq()메서드가 필요하다.)
"""
원자적 불변형은 모두 해시가 가능하고, frozenset는 언제나 해시 가능하다.
모든 요소가 해시 가능하도록 정의되어 있으므로, 튜플은 들어 있는 항목들이 모두 해시 가능해야 해시 가능하다.
"""
tt = (1,2,(30,40))
hash(tt)
t1 = (1,2,[30,40])
hash(t1)
tf=(1,2,frozenset([30,40])
hash(tf)
"""
dict 구현
"""
a = dict(one=1, two=2, three =3)
b = {'one':1, 'two':2, 'three':3)
c = dict(zip(['one','two','three'], [1,2,3]))
d = dict(['two',2),('one',1),('three',3)])
e = dict({'three':3, 'one':1, 'two':2})
a == b == c == d == e #True