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

Kjj*_*ssy 35 python django python-2.7 python-3.x django-1.9

我有点好奇知道为什么Django 1.9用设置,URL和其他配置文件中的lists []替换了元组()

我刚升级到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'),
]
Run Code Online (Sandbox Code Playgroud)

urls.py

urlpatterns = [
    url(r'^', admin.site.urls),
]
Run Code Online (Sandbox Code Playgroud)

这些变化有什么不同吗?

Sel*_*cuk 54

问题#8846(强调我的)解释:

在创建您自己的设置的文档中,有一条建议显示"对于序列设置,使用元组而不是列表.这纯粹是为了提高性能."

这是铺位.分析表明元组的运行速度并不比大多数操作的列表快(当然循环,我们可能最常做).另一方面,list-literal语法的优点是,当您有一个项目并且省略尾随逗号(如元组语法)时,它不会折叠为单个值.使用列表语法不会更慢,更清晰,更不容易出错.在更广泛的Python社区中经常表达的观点似乎不应将元组视为不可变列表.它们用作固定长度的记录 - 实际上元组的数学概念与序列的数学概念完全不同.

另请参阅此答案以获取更新的讨论.

另一个答案(与此问题没有直接关系)表明访问元素实际上更快list.

更新和进一步的信息:上述问题在几年前就已经结束是正确的,但我把它包括在内是因为它解释了决定背后的理由,许多类似的讨论都提到了同一张票.实际的实现决定是在以下关于 Django开发者Aymeric Augustin开始的django-developers的讨论之后触发的:

我更喜欢它们[列表]有两个原因:

1)所有这些设置都是类似事物的序列.这些值最好用列表表示,除非它们必须是不可变的,在这种情况下可以使用元组.(元组在Python中都是"没有名字的命名元组"和"不可变列表".)

2)列表不容易出现"单项元组中缺少逗号"的问题,这些问题会引发初学者和经验丰富的pythonistas.Django甚至还有一些代码来防御这个错误,以防止一些设置.在源中搜索"tuple_settings".

切换到列表实际上发生在问题#24149中,这也引用了上述讨论.


Rem*_*ich 10

1.9的发行说明中,有:

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

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

所以它似乎只是为了一致性而做.元组和列表都应该正常工作.如果你使用带有1个元素的元组,请记住逗号(1,),否则它不是元组而只是parens中的表达式.

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