簡體   English   中英

Django 1.9為什么在設置和URL中用list []替換元組()?

[英]Why did Django 1.9 replace tuples () with lists [] in settings and URLs?

我很好奇,為什么Django 1.9為什么在設置,URL和其他配置文件中用list []替換了tuples()

我剛剛升級到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),
]

這些變化有什么不同嗎?

在問題#8846 (強調我的問題)中對此進行了解釋:

在創建自己的設置的文檔中,有一條建議顯示為``對於序列設置,請使用元組而不是列表。這純粹是為了提高性能''。

這是鋪位。 分析表明,元組的運行速度並不比大多數操作的列表快(當然,循環可能是我們最常做的)。 另一方面, 列表字面量語法的優點是,當您具有單個項目並省略尾隨逗號時,它不會折疊為單個值,例如元組語法。 使用列表語法不會更慢,更清晰,更不會出錯。 在更廣泛的Python社區中,經常表達的觀點似乎是,不應將元組視為不可變的列表。 它們旨在用作固定長度的記錄-實際上,元組的數學概念與序列的概念完全不同。

另請參閱此答案以獲取最新討論。

另一個答案 (與該問題沒有直接關系)表明, 使用 list更快地訪問元素

更新和更多信息:上面的問題幾年前已經關閉,這是正確的,但是我將其包含在內是因為它解釋了該決定的原因,並且許多類似的討論都涉及同一票證。 在核心Django開發人員Aymeric Augustin 對django開發人員進行以下討論之后,觸發了實際的實現決策:

我更喜歡它們[列表]有兩個原因:

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

2)列表不容易出現“單項元組中缺少逗號”的問題,這對初學者和經驗豐富的pythonista都是一樣的。 Django甚至有一些代碼可以通過一些設置來防御此錯誤。 在源代碼中搜索“ tuple_settings”。

切換到列表實際上發生在問題#24149中 ,該問題也參考了上面的討論。

1.9的發行說明中 ,有:

現在列出了元組的默認設置

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

因此看來,這樣做只是為了保持一致性。 元組和列表都應該可以正常工作。 如果您使用具有1個元素的元組,請記住逗號(1,)因為否則它不是元組,而只是parens中的一個表達式。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM