"fluent python" 3장을 정리한 내용입니다.
Python is basically dics wrapped in loads of syntatic sugar
__ builtins__.__dict__: 내장함수를 여기에 담고 있음 python2.7 부터 list comprehension과 generation expression을 dict comprehension에 적용
example code
country_dial = {country: code for cod country in dial_codes}
{code: country.upper()
for country, code in sorted(country_dial.items())}
| 를 이용하여, mapping을 set union operation처럼 이용 가능
example code
d1 = {'a': 1, 'b':3}
d2 = {'a': 2, 'b':4, 'c':6}
d1 | d2
>>> {'a':2, 'b':4, 'c':6}
collections.abc 모율은 dict 및 유사한 인터페이스를 제공하기위해 MutableMapping, Mapping abc 클래스를 제공
특화된 mapping은 abc 대신 dict 이나, collections.UserDict 클래스를 상속
추상 베이스 클래스는 매핑이 제공해야하는 최소한의 인터페이스를 제공, 분서화하기위한 것이며, isinstance()테스트를 하기위한 기준으로 사용
e.g ) isinstance(dict, collections.abc.Mapping)
표준 라이브러리를 제공하는 매핑형은 모두 dict형을 이용하여 구현,
dict의 key 값은 hashable 해야하는 제한이 있음
hashable의 의미
수명 주기동안 결코 변하지 않는 hash값을 가지고 있고(hash()), 다른 객체와 비료할 수 있으면(eq()) hashable 하다고 이야기
동일하다고 판단되는 객체는 모두 해시값이 동일해야함
str, byte, 수치형 처럼 불변형 자료형은 모두 해시 가능
frozenset, tuple 해시가능
python이 제공하는 불변 내장 객체는 모두 해시가능하다라고 알려져 있지만, 튜플형은 불변형이긴 하나, 해시 불가능한 객체를 참조 할 수 있다.
user defined types: hashable
-> id() : hash값
-> __eq__() 메소드가 __hash__()로 생성되는 object의 id를 비교할 수 있게 되어 있기 때문에
해시를 어디에 이용할까? : hash값으로 돌려받는 integer value를 dicionary key와 비교하여 값을 찾기 위해 ( 중복여부가 중요한 문제 )
-> 따라서 항상 값이 일정해야 하므로, 변경가능한 객체는 hashable 하지 않다
e.g) dict.update(m, [**kwars]) : (key,value)쌍의 매핑이나, 반복형 객체에서 가져온 항목들로 d 갱신
존재하지 않는 키를 setdefault()로 처리하기
__getitem__() 이나 get() 메서드를 사용하는 것이 어색한 경우에 이용키가 존재하지 않는 경우에 , 다음과 같은 두가지 특별한 값을 반환하여 mapping에 용이하도록 이용
__missing__() 메서드 추가 존재하지 않는 키로 검색할 때 요청에 따라 항목을 생성하도록 설정
작동방식 : 객체를 생성할 때 존재하지 않는 키 인수로 __getitem__() 을 호출할 때마다 기본값을 생성하기위 callable제공
e.g. dd= defaultdic(list) 로 기본 객체를 생성하고, dd 에 존재하지 않는 key로 dd['key']를 수행하면 다음과 같은 과정을 거친다.
__getitem__()호출에 대한 기본 값을 제공하기위해 호출되며, 다른 메서드를 통해 호출되지 않는다.__missing__() special method에 의존__missing__() method존재하지 않느 키 처리
dict클래스를 상속,__missing__()을 정의하면, dict.__getitem__() 표준메서드가 KeyError를 발생시키지 않고 __missing__()을 호출
in연산자를 구현하는 get(), __contains__()는 __missing__()에 영향을 미치지 않고, __getitem__()의 경우에만 default_factory가 작동
_ NOTE _
사용자 정의형 mapping을 만들때 dict보다는 collection.UserDict클래스를 상속하는게 낫다.