Подтвердить что ты не робот

Почему Python не унифицирован?

После прочтения этого вопроса я заметил, что S. Lott, возможно, любил использовать "упорядоченный defaultdict", но он не существует. Теперь я задаюсь вопросом: почему в Python у нас так много классов 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)

который объединяет все и предоставляет каждую полезную комбинацию?

4b9b3361

Ответ 1

Одна из проблем заключается в том, что для того, чтобы это изменение нарушило обратную совместимость, из-за использования этого типа использования конструктора, которое существует сейчас:

>>> dict(one=1, two=2)
{'two': 2, 'one': 1}

Ответ 2

Эти дополнительные опции не предоставляются бесплатно. Поскольку 99,9% Python построено на dict, очень важно сделать его как можно более минимальным и быстрым.

Ответ 3

Потому что реализации сильно различаются. В основном вы получите dict factory, который возвращает экземпляр _dict (очень быстрый, низкопоставленный словарь - текущий dict), ordereddict, defaultdict,... класс. Кроме того, вы больше не можете инициализировать словари с аргументами с ключевыми словами; программы, основанные на этом, потерпят неудачу:

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

Кроме того, когда это разумно, различные классы уже наследуют друг от друга:

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

Ответ 4

Вот почему языки имеют "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 )

Нет реальных изменений в приложении, есть?