python - ¿Por qué Django 1.9 reemplazó tuplas() con listas[] en configuraciones y URL?




python-2.7 django-settings (2)

Tengo curiosidad por saber por qué Django 1.9 reemplazó tuplas () con listas [] en configuraciones, URL y otros archivos de configuración

Acabo de actualizar a Django 1.9 y noté estos cambios. ¿Cuál es la lógica detrás de ellos?

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),
]

¿Hay algo diferente debido a estos cambios?


En las notas de la versión de 1.9 , hay:

La configuración predeterminada que eran tuplas ahora son listas

La configuración predeterminada en django.conf.global_settings era una combinación de listas y tuplas. Todas las configuraciones que anteriormente eran tuplas ahora son listas.

Entonces parece que se hizo por coherencia. Tanto las tuplas como las listas deberían funcionar bien. Si usa una tupla con 1 elemento, recuerde la coma (1,) porque de lo contrario no es una tupla, sino simplemente una expresión en parens.

En cuanto a los patrones url, los solía definirse usando una función de patterns() , pero eso estaba obsoleto en Django 1.8, ya que una lista de instancias de URL funciona bien. Como la función se eliminará en el futuro, no se debe usar en nuevas aplicaciones y proyectos.


Se explica en el número #8846 (el énfasis es mío):

En la documentación para crear su propia configuración, hay una recomendación que dice "Para las configuraciones que son secuencias, use tuplas en lugar de listas. Esto es puramente por rendimiento".

Esto es una litera. La creación de perfiles muestra que las tuplas no se ejecutan más rápido que las listas para la mayoría de las operaciones (sin duda, en bucle, lo que es probable que hagamos con más frecuencia). Por otro lado, la sintaxis de lista-literal tiene la ventaja de que no colapsa a un solo valor cuando tiene un solo elemento y omite la coma final, como la sintaxis de tupla. Usar la sintaxis de lista no es más lento, más legible y menos propenso a errores. Una visión a menudo expresada en la comunidad más amplia de Python parece que las tuplas no deberían considerarse listas inmutables. Se conciben como registros de longitud fija; de hecho, el concepto matemático de una tupla es bastante distinto del de una secuencia.

También vea esta respuesta para una discusión más actualizada.

Otra answer (no relacionada directamente con este problema) demuestra que el acceso a los elementos es realmente más rápido con una list .

Actualización y más información: es correcto que el problema anterior se cerró hace años, pero lo incluí porque explicaba la razón de ser de la decisión y muchas discusiones similares se refieren al mismo ticket. La decisión de implementación real se desencadenó después de la siguiente discusión sobre django-developers iniciada por el desarrollador principal de Django Aymeric Augustin :

Los prefiero [listas] por dos razones:

1) Todos estos ajustes son secuencias de cosas similares. Dichos valores se representan mejor con listas, a menos que tengan que ser inmutables, en cuyo caso se puede usar una tupla. (Las tuplas son tanto "namedtuples sin nombres" como "listas inmutables" en Python).

2) Las listas no son propensas al problema de "falta de coma en una sola tupla de un solo elemento", que muerde tanto a los principiantes como a los pitonistas experimentados. Django incluso tiene un código para defenderse contra este error para un puñado de configuraciones. Busque "tuple_settings" en la fuente.

Y el cambio a las listas realmente sucedió en el número 24149, que también se refirió a la discusión anterior.





django-1.9