19

この答えを引用する:

タプルが不変であることに加えて、それらの使用法をガイドする必要があるセマンティックの区別もあります。タプルは異種のデータ構造です(つまり、それらのエントリは異なる意味を持ちます)が、リストは同種のシーケンスです。タプルには構造があり、リストには順序があります。

これは私には理にかなっています。しかし、なぜDjangoは設定にリストではなくタプルを使用するのですか?例:

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

これ(および他のすべての設定)は、意味的にリストの完璧なケースではありませんか?

4

3 に答える 3

13

これはDjango1.9で変更されました:

タプルであったデフォルト設定がリストになりました

django.conf.global_settingsのデフォルト設定は、リストとタプルの組み合わせでした。以前はタプルであったすべての設定がリストになりました。

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

于 2016-03-08T19:08:00.717 に答える
10

この質問に関するuser1474837のDjangoチケットへの役立つリンクに基づくと、タプルは、リストよりも高速であるという信念のために、最初から設定が行われた方法との下位互換性のために使用されていることは明らかです。(チケットのディスカッションで引用されたデータによると、それらはごくわずかですが、ごくわずかです。)

具体的には、Djangoのドキュメントは次のように言っていました。

シーケンスである設定の場合、リストの代わりにタプルを使用します。これは純粋にパフォーマンスのためです。

議論の後半で、Djangoコア開発者は次のように述べています。

タプルからリストに移動しようとはしていません。これは、すでにタプルであると想定している既存のコードを壊してしまうためです。ただし、人を怖がらせる価値はないので、パフォーマンスノートは削除します。

元のドキュメントの「純粋に」という言葉に注意してください。これは、額面どおりに取得した場合、設定が不変であることを示すことを意味し、タプルが使用される理由ではありません。また、チケットディスカッションの誰かが設定を「一種の」不変として参照しているため、設定が実際に不変であるかどうかさえ明確ではないことに注意してください。

PS興味のために、チケットの解決は次で終わることに注意してください:

「独自の設定を作成する」の推奨事項を変更して、Djangoがタプルを使用することを言及しましたが、推奨事項にはしていません。それは、無限のタプル対リストの議論を先導するかもしれません。

于 2012-09-11T05:00:43.860 に答える
2

理由の一部は、タプルが読み取り専用であり、より安全で設定に適していることだと思います。

于 2012-09-11T04:03:33.783 に答える