我有点好奇为什么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'),
]
url.py
urlpatterns = [
url(r'^', admin.site.urls),
]
这些变化有什么不同吗?
2条答案
按热度按时间nbnkbykc1#
在问题#8846(强调我的)中解释:
在创建您自己的设置的文档中有一条建议,内容是“对于序列设置,使用元组而不是列表。这纯粹是为了业绩”
这是废话。分析表明,对于大多数操作(当然是循环,这是我们最经常做的),元组的运行速度并不比列表快。另一方面,**list-literal语法的优点是,当你有一个单独的项并省略尾部逗号时,它不会像tuple语法那样折叠成一个单独的值。使用列表语法并不慢,更清晰,更不容易出错。**在更广泛的Python社区中,一个经常表达的观点似乎是元组不应该被认为是不可变的列表。它们被设计成固定长度的记录--事实上,元组的数学概念与序列的数学概念非常不同。
另请参阅this answer以获得更新的讨论。
另一个answer(与此问题没有直接关系)演示了使用
list
访问元素的速度实际上更快。**更新和更多信息:**上述问题在几年前就已经关闭了,这是正确的,但我把它包括在内,因为它解释了决定背后的理由,许多类似的讨论指的是同一张票。实际的实现决定是在以下由核心Django开发人员Aymeric Augustin发起的关于django-developers的讨论之后触发的:
我更喜欢它们,有两个原因:
1)所有这些设置都是类似事物的序列。这些值最好用列表表示,除非它们必须是不可变的,在这种情况下可以使用元组。(元组在Python中既是“没有名称的namedtuples”,也是“不可变列表”。
2)列表不容易出现“单项元组中缺少逗号”的问题,初学者和经验丰富的pythonists都一样。Django甚至有代码可以在一些设置中防止这种错误。在源代码中搜索“tuple_settings”。
而切换到列表实际上发生在issue #24149中,这也参考了上面的讨论。
kq4fsx7k2#
在1.9的发行说明中,有:
以前是元组的默认设置现在是列表
在django.conf.global_settings中的默认设置是列表和元组的组合。以前是元组的所有设置现在都是列表。
因此,它似乎只是为了保持一致性。元组和列表都应该可以正常工作。如果你使用一个包含1个元素的元组,请记住逗号
(1,)
,否则它就不是一个元组,而只是一个括号中的表达式。至于urlpatterns,它们曾经使用
patterns()
函数定义,但在Django 1.8中被弃用,因为url示例列表可以正常工作。由于该功能将在未来被删除,因此不应在新的应用程序和项目中使用。