2016-03-18 26 views
34

io sono un po 'curioso di sapere perché Django 1.9 sostituito tuple() con le liste [] nelle impostazioni, URL e altri file di configurazionePerché Django 1.9 ha sostituito tuple() con elenchi [] in impostazioni e URL?

Ho appena aggiornato a Django 1.9 e notò questi cambiamenti. Qual è la logica dietro di loro?

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

sia qualcosa di diverso a causa di questi cambiamenti?

risposta

53

è spiegato nel numero #8846 (sottolineatura mia):

Nella documentazione per creare il proprio impostazioni c'è una raccomandazione che recita "Per le impostazioni che sono sequenze, utilizzare tuple invece di liste. Questo è puramente per le prestazioni. "

Questo è a castello. La creazione di profili mostra che le tuple non eseguono più velocemente degli elenchi per la maggior parte delle operazioni di (in loop, il che probabilmente è il più probabile per fare il ). D'altra parte, la sintassi list-letteral ha il vantaggio che non collassa in un singolo valore quando si ha un singolo elemento e omette la virgola finale, come la sintassi della tupla. L'utilizzo della sintassi di elenco non è più lento, più leggibile e meno soggetto a errori. Una vista spesso espressa in la più ampia comunità Python sembra che le tuple non dovrebbero essere considerate come liste immutabili. Sono intesi come record a lunghezza fissa, anzi il concetto matematico di una tupla è abbastanza diverso da quello di una sequenza .

Vedere anche this answer per una discussione più aggiornata.

Un'altra answer (non direttamente legati a questo problema) dimostra che di accesso a elementi è in realtà più veloce con un list.

aggiornamento e ulteriori informazioni: È vero che la questione di cui sopra è stata chiusa anni fa, ma ho compreso perché spiega la logica alla base della decisione e molte discussioni simili si riferiscono allo stesso biglietto. La decisione effettiva attuazione è stata innescata dopo la following discussion on django-developers iniziata dal nucleo Django sviluppatore Aymeric Augustin:

loro [list] preferisco per due motivi:

1) Tutte queste impostazioni sono sequenze di cose simili. Tali valori sono meglio rappresentati con elenchi, a meno che non debbano essere immutabili, in in quale caso può essere utilizzata una tupla. (le tuple sono entrambe "namedtuples senza nomi " e "elenchi immutabili" in Python.)

2) Gli elenchi non sono inclini alla "virgola mancante nella tupla di una singola voce" problema che morde sia i principianti sia i pitonisti esperti. Django ha persino il codice per difendersi da questo errore per una manciata di impostazioni . Cerca "tuple_settings" nella sorgente.

E il passaggio alle liste è effettivamente avvenuto in issue #24149 che faceva riferimento anche alla discussione precedente.

10

In the release notes of 1.9, si trova: impostazioni

predefinite che erano tuple sono ora elenca

Le impostazioni predefinite in django.conf.global_settings erano una combinazione di liste e tuple. Tutte le impostazioni che precedentemente erano tuple sono ora elenchi.

Quindi sembra che sia stato appena fatto per coerenza. Entrambe le tuple e le liste dovrebbero funzionare bene. Se usi una tupla con 1 elemento, ricorda la virgola (1,) perché altrimenti non è una tupla ma semplicemente un'espressione in parens.

Quanto a urlpatterns, quelli utilizzati da definire utilizzando una funzione patterns(), ma che è stata sconsigliata a Django 1.8, come un elenco di istanze URL funziona bene. Poiché la funzione verrà rimossa in futuro, non dovrebbe essere utilizzata in nuove app e progetti.