我有点好奇知道为什么Django 1.9用设置,URL和其他配置文件中的list []替换了元组()
我刚刚升级到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),
]
由于这些变化,有什么不同吗?
答案 0 :(得分:54)
问题#8846(强调我的)解释:
在创建自己的设置的文档中有一个 建议,其中显示“对于序列的设置,请使用 元组而不是列表。这纯粹是为了表现。“
这是铺位。分析显示元组运行速度不比列表快 大多数操作(当然是循环,我们可能做的最多 经常)。另一方面, list-literal语法的优点是 当您有一个项目时,它不会折叠为单个值 省略尾随逗号,就像元组语法一样。使用列表语法是否定的 更慢,更清晰,更不容易出错。经常表达的观点 更广泛的Python社区似乎不应该考虑元组 作为不可变的列表。它们的目的是作为固定长度的记录 - 事实上 元组的数学概念与a的数学概念截然不同 序列
另请参阅this answer以获取更新的讨论。
另一个answer(与此问题没有直接关系)表明访问元素实际上更快list
。
更新和进一步的信息:上述问题在几年前就已经结束是正确的,但我之所以将其包括在内,是因为它解释了该决定背后的理由,许多类似的讨论都引用了相同的故障单。实际的实现决策是在核心Django开发人员following discussion on django-developers启动Aymeric Augustin之后触发的:
我更喜欢 [list] ,原因有两个:
1)所有这些设置都是类似的事情。这样的价值观是 最好用列表表示,除非它们必须是不可变的 在哪种情况下可以使用元组。 (元组都是“没有命名的元组 在Python中命名“和”不可变列表。)
2)列表不容易出现“单项元组中缺少逗号” 引起初学者和经验丰富的pythonistas的问题。 Django甚至还有一些代码来防御这个错误 设置。在源代码中搜索“tuple_settings”。
切换到列表实际上发生在issue #24149中,这也引用了上述讨论。
答案 1 :(得分:10)
元组的默认设置现在是列表
django.conf.global_settings 中的默认设置是列表和元组的组合。以前为元组的所有设置现在都是列表。
所以看起来它只是为了保持一致性。元组和列表都应该正常工作。如果你使用带有1个元素的元组,请记住逗号(1,)
,因为否则它不是元组,只是在parens中的表达式。
至于urlpatterns,那些曾经使用patterns()
函数定义,但在Django 1.8中已弃用,因为url实例列表工作正常。由于该功能将来会被删除,因此不应该在新的应用和项目中使用。