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

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

Мне очень интересно узнать, почему Django 1.9 заменил tuples() на списки [] в настройках, 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),
]

Из-за этих изменений что-то другое?

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

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

Ответ 2

В примечаниях к выпуску 1.9 есть:

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

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

Итак, похоже, что это было сделано только для согласованности. Оба кортежа и списки должны работать нормально. Если вы используете кортеж с 1 элементом, помните запятую (1,), потому что иначе это не кортеж, а просто выражение в parens.

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