2016-03-18 15 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实例列表可以正常工作。由于该功能将来会被删除,因此不应将其用于新的应用程序和项目。