web-dev-qa-db-ja.com

設定とURLでDjango 1.9がタプル()をリスト[]に置き換えたのはなぜですか?

設定、URL、その他の構成ファイルでDjango 1.9がタプル()をリスト[]に置き換えた理由を知りたいのですが

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'),
]

rls.py

urlpatterns = [
    url(r'^', admin.site.urls),
]

これらの変更のために何か違いはありますか?

35
Kjjassy

それは問題で説明されています #8846 (私の強調):

独自の設定を作成するためのドキュメントには、「シーケンスである設定の場合、リストの代わりにタプルを使用してください。これは純粋にパフォーマンスのためです」という推奨事項があります。

これは二段ベッドです。プロファイリングは、タプルがほとんどの操作でリストよりも速く実行されないことを示しています(確かにループします。これは私たちが最も頻繁に行う可能性があります)。一方、list-literal構文には、タプル構文のように、単一の項目があり、末尾のコンマを省略した場合に、単一の値に折りたたまれないという利点があります。リスト構文の使用は、遅くなく、読みやすく、エラーが発生しにくいものではありません。より広いPythonコミュニティで頻繁に表現されるビューは、タプルを次のように見なすべきではないようです。不変のリスト。これらは固定長のレコードとして意図されています。実際、タプルの数学的な概念は、シーケンスの数学的な概念とはまったく異なります。

最新の議論については、 この回答 も参照してください。

別の answer (この問題に直接関係しない)は、要素へのアクセスが実際にはlistの方が速いことを示しています。

更新と詳細情報:上記の問題は数年前にクローズされたのは正しいですが、決定の背後にある理論的根拠などを説明しているので、それを含めました議論は同じチケットを参照します。実際の実装の決定は、 Django-developersに関する次の議論 コアによって開始された後にトリガーされましたDjango開発者 Aymeric Augustin

私は2つの理由でそれら[リスト]を好みます:

1)これらの設定はすべて類似したもののシーケンスです。このような値は、不変である必要がない限り、リストで表すのが最適です。不変である必要がある場合は、タプルを使用できます。 (タプルは、Pythonでは「名前のないnamedtuples」と「不変リスト」の両方です。)

2)リストは、初心者と経験豊富なpythonistaの両方を苦しめる「単一アイテムのタプルにコンマがない」問題が発生する傾向がありません。 Djangoには、いくつかの設定でこの間違いを防ぐためのコードもあります。ソースで「Tuple_settings」を検索してください。

そして、リストへの切り替えは実際に issue#24149 で発生しました。これは、上記の説明も参照しています。

54
Selcuk

1.9のリリースノート には、次のものがあります。

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

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

したがって、一貫性を保つために行われたようです。タプルとリストの両方が正常に機能するはずです。 1つの要素を持つタプルを使用する場合は、コンマ_(1,)_を覚えておいてください。それ以外の場合は、タプルではなく、単に親の式です。

Urlpatternsに関しては、以前はpatterns()関数を使用して定義されていましたが、urlインスタンスのリストが正常に機能するため、Django 1.8では非推奨になりました。将来削除されるため、新しいアプリやプロジェクトで使用しないでください。

10
RemcoGerlich