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

Почему Django использует кортежи для настроек, а не для списков?

Цитата этот ответ:

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

Это имеет смысл для меня. Но почему Django использует кортежи, а не списки для настроек? Пример:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
)

Разве это (и все остальные настройки) не подходит для семантически для списка?

4b9b3361

Ответ 1

На основе user1474837 полезной ссылкой на Django ticket по этому вопросу, кажется очевидным, что кортежи используются для обратной совместимости с тем, как были настройки сделанные с самого начала, которые были с кортежами из-за убеждения, что они быстрее, чем списки. (Они есть, но только очень немного, согласно данным, приведенным в обсуждении билета.)

В частности, Django docs говорил:

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

Позже в обсуждении основной разработчик Django отмечает:

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

Обратите внимание на слово "чисто" в исходной документации, которое, если оно принимается по номинальной стоимости, означает, что параметры индикации неизменяемы, не является основанием для использования кортежей. Также обратите внимание, что кто-то в настройках ссылок на обсуждение билетов "как-то" неизменен, поэтому даже четкие настройки на самом деле неизменяемы.

P.S. Для интереса обратите внимание, что разрешение на билет заканчивается:

Изменена рекомендация "написать свои собственные настройки", чтобы отметить, что Django использует кортежи, но не делает его рекомендацией. Это может привести к бесконечному tuples vs. list.

Ответ 2

Это было изменено в Django 1.9:

Настройки по умолчанию, которые были кортежами, теперь перечислены

Настройки по умолчанию в django.conf.global_settings были комбинацией списков и кортежей. Все настройки, которые раньше были кортежами, теперь перечислены.

https://docs.djangoproject.com/en/1.9/releases/1.9/#default-settings-that-were-tuples-are-now-lists

Ответ 3

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