35 votes

Pourquoi Django 1.9 a-t-il remplacé tuples () par des listes [] dans les paramètres et les URL?

Je suis un peu curieux de savoir pourquoi Django 1.9 a remplacé tuples () par des listes [] dans les paramètres, les URL et d’autres fichiers de configuration.

Je viens de passer à Django 1.9 et j'ai remarqué ces changements. Quelle est la logique derrière eux?

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

Est-ce que quelque chose de différent à cause de ces changements?

54voto

Selcuk Points 15733

Il est expliqué dans le numéro #8846 (l'emphase est mienne):

Dans la documentation pour la Création de vos propres paramètres, il y a un la recommandation qui se lit "Pour les paramètres qui sont des séquences, l'utilisation tuples à la place des listes. C'est purement pour la performance."

C'est de la foutaise. Profilage montre que les tuples exécuter plus rapidement que les listes pour la plupart des opérations (certainement le bouclage, qui nous sont susceptibles de ne plus souvent). D'autre part, la liste de la syntaxe littérale a l'avantage de il ne s'effondre pas à une seule valeur lorsque vous avez un seul élément et omettre la virgule, comme le n-uplet de la syntaxe. Utilisant la syntaxe de la liste n'est pas plus lent, plus lisible et moins sujette aux erreurs. Souvent exprimé en vue l'ensemble de la communauté Python semble que les tuples ne doit pas être considéré comme comme immuable listes. Ils sont destinés à la longueur fixe de dossiers en effet le concept mathématique d'un tuple est tout à fait distincte de celle d'un la séquence.

Voir aussi cette réponse pour une plus up-to-date de la discussion.

Une autre réponse (pas directement liée à cette question) montre que l'accès aux éléments se fait plus rapidement, avec un list.

Mise à jour et complément d'information: Il est exact que le problème ci-dessus, a été fermée il y a des années, mais je l'ai inclus parce qu'il explique les raisons de cette décision et de nombreuses discussions semblables reportez-vous à la même billet. La mise en œuvre effective de la décision a été déclenchée après la suite de la discussion sur django-les développeurs ont commencé par la base de Django développeur Aymeric Augustin:

Je les préfère [listes] pour deux raisons:

1) Tous ces paramètres sont des séquences de choses semblables. Ces valeurs sont le mieux représenté avec des listes, à moins qu'ils ont d'être immuable, dans auquel cas un n-uplet peut être utilisé. (les tuples sont à la fois "namedtuples sans les noms" et "immuable listes en Python.)

2) les Listes ne sont pas sujettes à la "manquant virgule dans un seul élément d'un tuple" le problème qui se mord les débutants et les pythoneux semblables. Django a même code pour se défendre contre cette erreur pour une poignée de les paramètres. Recherche pour "tuple_settings" dans la source.

Et le passage à des listes s'est réellement passé dans le numéro 24149 qui se réfère aussi à la discussion ci-dessus.

10voto

RemcoGerlich Points 5676

Dans les notes de version de 1,9, il y a:

Les paramètres par défaut qui ont été les tuples sont désormais des listes

Les paramètres par défaut de django.conf.global_settings étaient une combinaison de listes et les tuples. Tous les paramètres qui ont été autrefois les tuples sont désormais des listes.

Il semble donc que ce qui a été fait pour des raisons de cohérence. Les deux tuples et des listes devrait fonctionner correctement. Si vous utilisez un tuple avec 1 élément, n'oubliez pas la virgule (1,) parce que sinon c'est pas un n-uplet mais simplement une expression dans les parenthèses.

Comme pour urlpatterns, ceux utilisés pour être défini à l'aide d'un patterns() de la fonction, mais qui a été déprécié dans Django 1.8, une liste d'url instances fonctionne très bien. Comme la fonction sera supprimée dans le futur, il ne devrait pas être utilisé dans de nouvelles applications et de projets.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X