【问题标题】:Why does Django use tuples for settings and not lists?为什么 Django 使用元组进行设置而不是列表?
【发布时间】:2012-09-03 04:58:26
【问题描述】:

引用this answer:

除了元组是不可变的之外,还有一个语义区别应该指导它们的使用。元组是异构数据结构(即它们的条目具有不同的含义),而列表是同构序列。元组有结构,列表有顺序。

这对我来说很有意义。但是为什么 Django 使用元组而不是列表进行设置呢?示例:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
)

这(以及所有其他设置)在语义上不是列表的完美案例吗?

【问题讨论】:

  • 是不是表示运行时无法安装其他应用?
  • 我认为这是因为当时 Django 的创建者认为它们更快。看到这个:code.djangoproject.com/ticket/8846
  • 看起来,有点像一些评论者在 user1474837 的链接 (code.djangoproject.com/ticket/8846) 上所说的那样,元组的不变性方面可能被用作 Django 设置是只读的语义指示符。如果您忽略关于列表与元组性能的错误假设,这似乎是唯一合乎逻辑的原因。

标签: python django list tuples semantics


【解决方案1】:

这在 Django 1.9 中有所改变:

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

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

https://docs.djangoproject.com/en/1.9/releases/1.9/#default-settings-that-were-tuples-are-now-lists

【讨论】:

  • 这似乎很重要,因为有很多教程/书籍在这一点上现在已经过时了。
【解决方案2】:

根据 user1474837 在这个问题上指向Django ticket 的有用链接,很明显,元组用于向后兼容从一开始就完成设置的方式,因为相信元组比列表更快,所以使用元组. (根据票务讨论中引用的数据,它们是,但只是非常轻微。)

具体来说,Django 文档曾经说过:

对于序列设置,使用元组而不是列表。这纯粹是为了性能。

在后面的讨论中,一位 Django 核心开发人员指出:

我们当然不会从元组转移到列表,因为它会破坏已经期望事物是元组的现有代码。不过,我会删除性能说明,因为它不值得吓唬人。

请注意原始文档中的“纯粹”一词——如果从表面上看,这意味着表明设置是不可变的,这不是使用元组的原因。另请注意,在票务讨论中有人将设置称为“某种”不可变,因此甚至不清楚设置实际上是不可变的。

附:出于兴趣,请注意票务解决方案以:

更改了“编写自己的设置”建议以提及 Django 使用元组,但不推荐它。这可能会阻止无尽的 元组与列表的辩论。

【讨论】:

    【解决方案3】:

    我认为部分原因是元组是只读的,这将更安全,更适合设置。

    【讨论】:

    • 如果您有通用、生产和开发设置并且想要附加例如debug_toolbar 到你的开发设置模块中的常见 INSTALLED_APPS?
    • 如果您在settings.py 的末尾加载它,没有什么能阻止您在local_settings.py 上执行FOO_SETTINGS = FOO_SETTINGS + ( another_foo_option, )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 2010-10-15
    • 1970-01-01
    • 2020-03-30
    • 2011-06-14
    • 2021-12-14
    相关资源
    最近更新 更多