繁体   English   中英

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

[英]Why did Django 1.9 replace tuples () with lists [] in settings and URLs?

我很好奇,为什么Django 1.9为什么在设置,URL和其他配置文件中用list []替换了tuples()

我刚刚升级到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),
]

这些变化有什么不同吗?

在问题#8846 (强调我的问题)中对此进行了解释:

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

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

另请参阅此答案以获取最新讨论。

另一个答案 (与该问题没有直接关系)表明, 使用 list更快地访问元素

更新和更多信息:上面的问题几年前已经关闭,这是正确的,但是我将其包含在内是因为它解释了该决定的原因,并且许多类似的讨论都涉及同一票证。 在核心Django开发人员Aymeric Augustin 对django开发人员进行以下讨论之后,触发了实际的实现决策:

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

1)所有这些设置都是类似的序列。 这样的值最好用列表表示,除非它们必须是不可变的,在这种情况下可以使用元组。 (在Python中,元组既是“没有名称的命名元组”,又是“不可变列表”。)

2)列表不容易出现“单项元组中缺少逗号”的问题,这对初学者和经验丰富的pythonista都是一样的。 Django甚至有一些代码可以通过一些设置来防御此错误。 在源代码中搜索“ tuple_settings”。

切换到列表实际上发生在问题#24149中 ,该问题也参考了上面的讨论。

1.9的发行说明中 ,有:

现在列出了元组的默认设置

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

因此看来,这样做只是为了保持一致性。 元组和列表都应该可以正常工作。 如果您使用具有1个元素的元组,请记住逗号(1,)因为否则它不是元组,而只是parens中的一个表达式。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM