Почему Django использует кортежи для настроек, а не списки?
Цитирую этот ответ:
Помимо того, что кортежи являются неизменяемыми, существует также семантическое различие, которое должно определять их использование. Кортежи - это гетерогенные структуры данных (т. Е. Их записи имеют разное значение), а списки - это однородные последовательности. Кортежи имеют структуру, списки имеют порядок.
Это имеет смысл для меня. Но почему Django использует кортежи, а не списки для настроек? Пример:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
)
Разве это (и все остальные настройки) семантически не является идеальным случаем для списка?
3 ответа
Исходя из полезной ссылки user1474837 на тикет Django по этому вопросу, становится ясно, что кортежи используются для обратной совместимости с настройками, которые были сделаны с самого начала, что было с кортежами, поскольку они были быстрее списков. (Они есть, но очень незначительно, согласно данным, приведенным в обсуждении билета.)
В частности, Django Docs говорил:
Для настроек, которые являются последовательностями, используйте кортежи вместо списков. Это чисто для производительности.
Далее в ходе обсуждения разработчик ядра Django отмечает:
Мы, конечно, не собираемся переходить от кортежей к спискам, потому что это сломало бы существующий код, который уже ожидает, что вещи будут кортежами. Однако я удалю заметку о производительности, так как не стоит пугать людей.
Обратите внимание на слово "чисто" в исходной документации, которое, если оно принимается за чистую монету, будет означать, что настройки неизменны, не является причиной использования кортежей. Также обратите внимание, что кто-то в обсуждении билета упоминает настройки как "своего рода" неизменяемые, так что даже не ясно, настройки на самом деле неизменны.
PS Для интереса обратите внимание, что разрешение билета заканчивается:
Изменили рекомендацию "напишите свои собственные настройки", чтобы упомянуть, что Django использует кортежи, но не делает это рекомендацией. Это может предотвратить бесконечные споры против списков и списков.
Это было изменено в Django 1.9:
Настройки по умолчанию, которые были кортежами, теперь являются списками
Настройки по умолчанию в django.conf.global_settings были комбинацией списков и кортежей. Все настройки, которые раньше были кортежами, теперь являются списками.
Я думаю, что причина в том, что кортеж предназначен только для чтения, что будет более безопасным и более подходящим для настройки.