2016-03-18 14 views
34

我有點好奇知道爲什麼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), 
] 

是什麼,因爲這些變化的不同?

回答

53

據發行#8846(重點煤礦)解釋說:

在創建你自己的設置文件有一個 建議,其內容「對於那些序列的設置,使用 元組而不是列表。這純粹是爲了表現。「

這是鋪位。分析表明,元組的運行速度不及大多數操作的列表(肯定是循環的,我們可能經常做的最多的是 )。另一方面,列表文字語法的優點在於,當您有單個項目時,它不會摺疊爲單個值,而且 可省略尾隨逗號(如tuple語法)。使用列表語法不是 更慢,更清晰,更不容易出錯。 經常表達的觀點,更廣泛的Python社區似乎認爲元組不應被認爲是 作爲不可變列表。它們的目的是作爲固定長度的記錄 - 實際上,一個元組的數學概念與 序列的數學概念完全不同。

另請參閱this answer瞭解更多最新的討論。

另一個answer(沒有直接關係這一問題)證明訪問元素list實際上要快。

更新和進一步的信息:上述問題在幾年前關閉是正確的,但我把它包括在內,因爲它解釋了決定背後的基本原理,許多類似的討論涉及同一張票。實際執行的決定是由核心的Django開發Aymeric Augustin開始following discussion on django-developers後觸發:

我喜歡他們[名單]有兩個原因:

1)所有這些設置都是類似的事情序列。這樣的值是 最好用列表表示,除非它們必須是不可變的,在 這種情況下可以使用元組。 (在Python中,元組都是「沒有 名稱的namedtuples」和「不可變列表」。)

2)列表不容易出現「單項元組中缺失的逗號」 問題,它咬合了初學者和經驗豐富的pythonistas。 Django甚至有代碼來防禦這種錯誤,爲少數幾個 設置。在源中搜索「tuple_settings」。

而且切換到列表實際發生在issue #24149中,這也參照上述討論。

10

the release notes of 1.9,有:可通過元組是

默認設置現在列出

的默認設置在django.conf.global_settings是列表和元組的組合。以前元組的所有設置都是列表。

因此,它似乎只是爲了一致性。元組和列表都應該正常工作。如果您使用1元素的元組,請記住逗號(1,),否則它不是元組,而只是parens中的表達式。

至於urlpatterns,那些曾經使用patterns()函數定義的函數,但在Django 1.8中已棄用,因爲url實例列表可以正常工作。由於該功能將來會被刪除,因此不應將其用於新的應用程序和項目。