为什么Django 1.9用设置和URL中的列表[]替换元组()?

时间:2016-03-18 09:51:07

标签: python django python-2.7 django-settings django-1.9

我有点好奇知道为什么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),
]

由于这些变化,有什么不同吗?

2 个答案:

答案 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)

the release notes of 1.9中,有:

  

元组的默认设置现在是列表

     

django.conf.global_settings 中的默认设置是列表和元组的组合。以前为元组的所有设置现在都是列表。

所以看起来它只是为了保持一致性。元组和列表都应该正常工作。如果你使用带有1个元素的元组,请记住逗号(1,),因为否则它不是元组,只是在parens中的表达式。

至于urlpatterns,那些曾经使用patterns()函数定义,但在Django 1.8中已弃用,因为url实例列表工作正常。由于该功能将来会被删除,因此不应该在新的应用和项目中使用。