Почему 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 были комбинацией списков и кортежей. Все настройки, которые раньше были кортежами, теперь являются списками.

https://docs.djangoproject.com/en/1.9/releases/1.9/

Я думаю, что причина в том, что кортеж предназначен только для чтения, что будет более безопасным и более подходящим для настройки.

Другие вопросы по тегам