2011-07-06 5 views
12

this question을 읽은 후 S. Lott이 "ordered defaultdict"를 사용하고 싶어했을 수도 있지만 존재하지 않는 것으로 나타났습니다. 자, 궁금합니다. 왜 파이썬에서 많은 dict 클래스를 사용합니까?왜 Python dicts가 통일되어 있지 않습니까?

  • DICT
  • blist.sorteddict
  • collections.OrderedDict
  • collections.defaultdict
  • weakref.WeakKeyDictionary
  • weakref.WeakValueDictionary
  • 다른 사람?
  • 모든 것을 통합하고, 모든 유용한 조합을 제공

왜 이런 일이,

dict(initializer=[], sorted=False, ordered=False, default=None, 
    weak_keys=False, weak_values=False) 

?

+0

그러면'a = {}'를 사용할 때 어떻게됩니까? – GWW

+2

'{}'는 기본 명령으로 기본 명령을 구성해야합니까? –

+0

나는 그가 다른 형태의 dict (우리가 사용하는)의 dict()을 사용하는 것을 의미한다고 생각한다. –

답변

11

하나의 문제는이 변화를 만드는 것은 인해 이전 버전과의 호환성을 깰 것입니다

+0

좋은 지적. 나는 그것을 잊었다. –

+0

이것이 좋은 이유라고 생각하지 않습니다. 하나의'dict' 클래스를 갖는 것이 하위 호환성과 별개로 좋은 아이디어 였다면, 파이썬 3에서 논쟁의 여지가있었습니다. – RoundTower

7

추가 옵션은 무료로 제공되지 않습니다. Python의 99.9 %가 dict으로 작성되었으므로 최대한 작고 빠르게 작성하는 것이 중요합니다. 매우입니다.

+1

'dict' 생성자 다른 모든 옵션이'False' /'None' 인 경우 일반, 경량'dict' 클래스를 반환합니다. –

+0

다른 옵션은 얼마나 자주 '거짓'/ '없음'이 아닌가? –

+1

문제는 링크 된 문제와 같은 문제가 있으면 사용할 수없는 원하는 조합 (예 : ordered defaultdict)입니다. 또한 필자는 파이썬을 처음 배우기 시작했을 때이 모든 다른 딕트에 대해 알지 못했고, 라이브러리에서 발견해야 할 것이 아니라 표준 사전에 대한 옵션으로 훨씬 더 많이 발견 될 수있었습니다. –

4

구현이 많이 다르기 때문에. 기본적으로 (매우 빠른, 낮은 오버 헤드 사전 - 현재 dict), ordereddict, defaultdict, ... 클래스의 인스턴스를 반환하는 dict 팩토리로 끝납니다. 또한 키워드 인수로 사전을 초기화 할 수 없습니다. 이에 의존하는 프로그램은 실패합니다 : 그것은 합리적인 때

>>> dict(sorted=42) 
{'sorted': 42} 
# Your proposal would lead to an empty dictionary here (breaking compatibility) 

게다가, 다양한 클래스가 이미 서로 상속 :

>>> collections.defaultdict.__bases__ 
(<type 'dict'>,) 
0

이 때문에 언어에 "mixins"가있는 이유가 여기에 있습니다.

올바른 클래스 묶음을 정의하여 다음과 같은 것을 만들 수 있습니다. 당신이 그 "통합"사전을 일단

class defaultdict(dict, unordered, default_init): pass 
class OrderedDict(dict, ordered, nodefault_init): pass 
class WeakKeyDict(dict, ordered, nodefault_init, weakkey): pass 
class KeyValueDict(dict, ordered, nodefault_init, weakvalue): pass 

다음, 응용 프로그램이

groups= defaultdict(list) 

같은 응용 프로그램에 어떤 진정한 변화가되어 봐?

관련 문제