Почему Django 1.9 заменил кортежи () списками [] в настройках и URL-адресах?

мне немного любопытно узнать, почему Django 1.9 заменил кортежи () списками [] в настройках, URL-адресах и других файлах конфигурации

Я только что обновился до Django 1.9 и заметил эти изменения. Какая логика за ними?

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles'
    ]

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

urls.py

urlpatterns = [
    url(r'^', admin.site.urls),
]

что-нибудь изменилось из-за этих изменений?

2 ответов


Это объясняется в выпуске #8846 (выделено мной):

в документации для создания собственных настроек есть рекомендация, которая гласит: "для настроек, которые являются последовательностями, используйте кортежи вместо списков. Это чисто для исполнения."

Это чушь. Профилирование показывает, что кортежи работают не быстрее, чем списки для большинство операций (конечно, цикл, который мы, вероятно, сделаем больше всего часто.) С другой стороны, list-литеральный синтаксис имеет то преимущество, что он не сворачивается до одного значения, когда у вас есть один элемент и опустите конечную запятую, например синтаксис кортежа. Использование синтаксиса списка-нет медленнее, разборчивее и менее подвержен ошибкам. часто выражаемое мнение в более широкое сообщество Python кажется, что кортежи не следует рассматривать как неизменяемые списки. Они предназначены как записи фиксированной длины-действительно математическое понятие кортеж весьма отличаются от последовательность.

см. Также ответ для более современного обсуждения.

другое ответ (не имеет прямого отношения к этой проблеме) демонстрирует, что доступ к элементам на самом деле быстрее с list.

обновление и дополнительная информация: правильно, что вышеупомянутый вопрос был закрыт несколько лет назад, но я включил его, потому что он объяснил обоснование решения и многие аналогичные обсуждения относятся к одному и тому же билету. Фактическое решение о реализации было инициировано после после обсуждения django-developers запущен разработчиком core Django Эмерик Огюстен:

Я предпочитаю им [списки] по двум причинам:

1) Все эти настройки являются последовательностями похожих вещей. Такие значения лучше всего представлять списки, если они не должны быть неизменяемыми, в в каком случае Кортеж может быть используемый. (кортежи оба " namedtuples без имена" и "неизменяемые списки" в Python.)

2) списки не склонны к " отсутствующей запятой в одноэлементном кортеже" проблема, которая кусает начинающих и опытных pythonistas одинаково. У Django даже есть код для защиты от этой ошибки для нескольких настройки. Поиск "tuple_settings"в источнике.

и переход к спискам фактически произошел в выпуск #24149, который также называют выше обсуждения.


на по версии 1.9 есть:

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

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

получается, что это было сделано только для консистенции. Оба кортежа и списки должны работать нормально. Если вы используете кортеж с 1 элементом, запомните запятую!--0--> потому что в противном случае это не Кортеж, а просто выражение в скобки.

Что касается urlpatterns, те, которые были определены с помощью patterns() функция, но это было устарело в Django 1.8, так как список экземпляров url работает нормально. Поскольку функция будет удалена в будущем, она не должна использоваться в новых приложениях и проектах.