web-dev-qa-db-fra.com

Pourquoi Python pep-8 recommande-t-il vivement les espaces sur les tabulations pour l'indentation?

Je vois dans Stack Overflow et PEP 8 qu'il est recommandé d'utiliser des espaces uniquement pour l'indentation dans les programmes Python. Je peux comprendre la nécessité d'une indentation cohérente et je me suis senti cette douleur.

Y at-il une raison sous-jacente pour les espaces à préférer J'aurais pensé qu'il était beaucoup plus facile de travailler avec des onglets.

135
quamrana

La réponse a été donnée directement dans le PEP [ed: ce passage a été modifié dans 201 ]. Je cite:

Le moyen le plus populaire Python est composé uniquement d'espaces.

De quelle autre raison sous-jacente avez-vous besoin?

Pour le dire moins: considérons également la portée du PEP comme indiqué dans le tout premier paragraphe:

Ce document donne les conventions de codage pour le code Python comprenant la bibliothèque standard de la distribution principale Python.

L'intention est de faire tout le code qui va dans la distribution officielle python (j'espère que nous pourrons convenir que c'est universellement une Bonne chose ™).

Comme la décision entre les espaces et les tabulations pour un programmeur individuel est a) vraiment une question de goût et b) facilement gérée par des moyens techniques (éditeurs, scripts de conversion, etc.), il existe un moyen clair de clore toute discussion: choisissez-en un. .

C'est Guido qui a choisi. Il n'a même pas eu à donner de raison, mais il l'a toujours fait en se référant à des données empiriques.

Dans tous les autres cas, vous pouvez prendre ce PPE comme une recommandation ou vous pouvez l'ignorer - votre choix, ou celui de votre équipe, ou de vos chefs d'équipe.

Mais si je peux vous donner un conseil: ne les mélangez pas ;-) [ed: Mélanger les tabulations et les espaces n’est plus une option.]

102
user3850

Eh bien, on dirait que tout le monde est fortement orienté vers les espaces. J'utilise exclusivement des onglets. Je sais très bien pourquoi.

Les onglets sont en fait une invention cool, qui est venu après espaces. Il vous permet d'indenter sans pousser l'espace des millions de fois ou en utilisant un faux onglet (qui produit des espaces).

Je ne comprends vraiment pas pourquoi tout le monde discrimine l'utilisation des onglets. Cela ressemble beaucoup aux personnes âgées qui discriminent les jeunes pour choisir une technologie plus récente et plus efficace et se plaindre que la numérotation par impulsion fonctionne sur chaque téléphone, pas seulement sur ces nouvelles. "La numérotation par tonalité ne fonctionne pas sur tous les téléphones, c'est pourquoi c'est faux".

Votre éditeur ne peut pas gérer les onglets correctement? Eh bien, procurez-vous un moderne éditeur. Cela pourrait être sacrément l'heure, nous sommes maintenant au 21ème siècle et le temps où un éditeur était un logiciel compliqué de haute technologie est révolu. Nous avons maintenant des tonnes et des tonnes d'éditeurs à choisir, toutes supportant bien les onglets. En outre, vous pouvez définir la taille d'un onglet, ce que vous ne pouvez pas faire avec des espaces. Vous ne pouvez pas voir les onglets? Qu'est-ce que c'est pour un argument? Eh bien, vous ne pouvez pas voir les espaces non plus!

Puis-je avoir l'audace de suggérer un meilleur éditeur? L’un de ces produits high-tech, déjà sorti il ​​y a une dizaine d’années, qui affiche des caractères invisibles? (sarcasme éteint)

L'utilisation d'espaces entraîne beaucoup plus de travail de suppression et de formatage. C'est pourquoi (et toutes les autres personnes qui le savent et qui sont d'accord avec moi) utilisent des tabulations pour Python.

Mélanger des tabulations et des espaces est un argument non-non et non. C'est un gâchis et ne peut jamais fonctionner.

84
nigratruo

Personnellement, je ne suis pas d'accord avec les espaces sur les onglets. Pour moi, les onglets sont un caractère/mécanisme de mise en page du document alors que les espaces sont destinés au contenu ou à la délimitation entre les commandes dans le cas de code.

Je suis d'accord avec Jim pour dire que les onglets ne sont pas vraiment le problème, ce sont les personnes et la façon dont elles veulent mélanger les onglets et les espaces.

Cela dit, je me suis forcé à utiliser des espaces pour des raisons de convention. J'apprécie la cohérence par rapport aux préférences personnelles.

39
Soviut

La raison des espaces est que les onglets sont facultatifs. Les espaces sont le dénominateur commun le plus bas de la ponctuation.

Chaque bon éditeur de texte a un "remplacer les tabulations par des espaces" et beaucoup de gens l’utilisent. Mais pas toujours.

Bien que certains éditeurs de texte puissent remplacer une série d'espaces par un onglet, cela est vraiment rare.

Résultat final. Vous ne pouvez pas vous tromper avec des espaces. Vous pourriez vous tromper avec les onglets. Donc, n'utilisez pas de tabulations et réduisez le risque d'erreurs.

29
S.Lott

Le problème avec les onglets est qu'ils sont invisibles et que les utilisateurs ne peuvent jamais se mettre d'accord sur la largeur des onglets. Lorsque vous mélangez des tabulations et des espaces et que vous définissez des tabulations sur autre chose que Python (qui utilise des tabulations tous les 8 espaces)], vous verrez le code dans une présentation différente de celle que Python le voit et, comme la mise en page détermine les blocs, vous verrez une logique différente qui conduit à des bogues subtils.

Si vous insistez pour défier PEP 8 et utiliser des tabulations - ou pire, mélanger des tabulations et des espaces - exécutez au moins toujours python avec l'argument '-tt', ce qui rend incohérent indentation (parfois un onglet, parfois un espace pour le même niveau d’indentation) une erreur. Si possible, configurez votre éditeur pour qu’il affiche les onglets différemment. Mais en réalité, la meilleure approche consiste à ne pas utiliser d’onglet, point.

25
Thomas Wouters

Les principaux problèmes d’indentation se produisent lorsque vous mélangez des tabulations et des espaces. Évidemment, cela ne vous dit pas lequel choisir, mais c’est une bonne raison de vous en recommander un, même si vous le choisissez en jetant une pièce de monnaie.

Cependant, à mon humble avis, il existe quelques raisons mineures de privilégier les espaces par rapport aux onglets:

  • Différents outils. Parfois, le code est affiché en dehors de l'éditeur du programmeur. Par exemple. posté dans un groupe de discussion ou un forum. Les espaces font généralement mieux que les onglets ici - partout, les espaces seraient mutilés, les onglets aussi, mais pas l'inverse.

  • Les programmeurs voient la source différemment. C'est profondément subjectif - c'est soit le principal avantage des onglets, soit une raison de les éviter en fonction de votre camp. Du côté positif, les développeurs peuvent voir la source avec l'indentation préférée. Ainsi, un développeur préférant l'indentation à 2 espaces peut travailler avec un développeur à 8 espaces sur la même source et le voir comme bon lui semble. L'inconvénient est qu'il y a des répercussions sur ceci - certaines personnes aiment 8-space car cela donne une indication très visible qu'elles sont trop profondément imbriquées - elles peuvent voir le code archivé par le 2-pénétrateur envelopper constamment dans leur éditeur. Le fait de voir le code de la même manière pour tous les développeurs conduit à une plus grande cohérence des longueurs de lignes, entre autres.

  • Indentation de ligne continue. Parfois, vous souhaitez mettre une ligne en retrait pour indiquer qu’elle est issue de la précédente. par exemple.

    def foo():
        x = some_function_with_lots_of_args(foo, bar, baz,
                                            xyzzy, blah)
    

    Si vous utilisez des onglets, il n'y a aucun moyen d'aligner cela pour les personnes utilisant des tabulations différentes dans leur éditeur sans mélanger les espaces et les onglets. Cela tue efficacement l'avantage ci-dessus.

De toute évidence cependant, il s’agit d’un problème profondément religieux, avec lequel la programmation est en proie. La question la plus importante est que nous devrions en choisir un - même si ce n’est pas celui que vous privilégiez. Parfois, je pense que le principal avantage d’une indentation importante est qu’au moins nous sommes épargnés par le placement des corsets.

Il est également intéressant de lire this article de Jamie Zawinski sur le sujet.

22
Brian

Notez que l'utilisation d'onglets confond un autre aspect de PEP 8:

Limitez toutes les lignes à un maximum de 79 caractères.

Supposons, de manière hypothétique, que vous utilisez une largeur de tabulation de 2 et que j'utilise une largeur de tabulation de 8. Vous écrivez tout votre code pour que vos lignes les plus longues atteignent 79 caractères, puis je commence à travailler sur votre fichier. Maintenant, j'ai du code difficile à lire car (comme l'indique le PEP):

Le wrapping par défaut dans la plupart des outils perturbe la structure visuelle du code

Si nous utilisons tous 4 espaces, c'est toujours la même chose. Toute personne dont l'éditeur peut prendre en charge une largeur de 80 caractères peut aisément lire le code. Remarque: la limite de 80 caractères est une guerre sainte en soi, alors ne commençons pas ici.

Tout éditeur non-idiot devrait avoir la possibilité d'utiliser des espaces comme s'il s'agissait d'onglets (insertion et suppression), de sorte que cet argument ne devrait vraiment pas être valide.

10
Thane Brimhall

La réponse à la question est la suivante: PEP-8 souhaite faire une recommandation et a décidé que, les espaces étant plus populaires, il recommanderait vivement les espaces au-dessus des tabulations.


Notes sur le PEP-8

PEP-8 dit 'Utilisez 4 espaces par niveau d'indentation.'
Il est clair qu'il s'agit de la recommandation standard.

'Pour un code très ancien que vous ne voulez pas gâcher, vous pouvez continuer à utiliser des onglets à 8 espaces.'
Il est clair qu'il existe QUELQUES circonstances dans lesquelles les onglets peuvent être utilisés.

'Ne mélangez jamais les tabulations et les espaces.'
C’est une interdiction claire de mélanger - je pense que nous sommes tous d’accord sur ce point. Python peut détecter cela et étouffe souvent. L'utilisation de l'argument -tt en fait une erreur explicite.

'Le moyen le plus populaire d'indenter Python utilise uniquement des espaces. Le deuxième moyen le plus populaire consiste à utiliser des tabulations uniquement.'
Cela indique clairement que les deux sont utilisés. Juste pour être ultra-clair: vous ne devriez toujours jamais mélanger des espaces et des onglets dans le même fichier.

'Pour les nouveaux projets, seuls les espaces sont fortement recommandés par rapport aux onglets.'
Ceci est une recommandation claire et forte, mais pas une interdiction des tabulations.


Je ne trouve pas de réponse satisfaisante à ma propre question dans PEP-8. J'utilise des onglets, que j'ai utilisés historiquement dans d'autres langues. Python accepte les sources avec l’utilisation exclusive des onglets. C’est suffisant pour moi.

Je pensais que je pourrais essayer de travailler avec des espaces. Dans mon éditeur, j'ai configuré un type de fichier pour utiliser exclusivement des espaces. Ainsi, il insère 4 espaces si j'appuie sur la touche de tabulation. Si j'appuie trop souvent sur l'onglet, je dois supprimer les espaces! Arrgh! Quatre fois plus de suppressions que d'onglets! Mon éditeur ne peut pas dire que j'utilise 4 espaces pour les retraits (bien qu'un éditeur puisse le faire) et insiste évidemment pour supprimer les espaces un à la fois.

On ne pourrait pas dire à Python de considérer les tabulations comme n espaces lors de la lecture des indentations? Si nous pouvions nous mettre d’accord sur 4 espaces par indentation et 4 espaces par onglet et autoriser Python pour accepter cela, alors il n'y aurait pas de problèmes.
Nous devrions trouver des solutions gagnant-gagnant aux problèmes.

7
quamrana

J'ai toujours utilisé des onglets dans mon code. Cela dit, j'ai récemment trouvé une raison d'utiliser des espaces: lors du développement sur ma tablette Internet Nokia N900, je disposais maintenant d'un clavier sans touche de tabulation. Cela m'a obligé à copier et coller des onglets ou à réécrire mon code avec des espaces. J'ai rencontré le même problème avec d'autres téléphones. Certes, ce n'est pas une utilisation standard de Python, mais une chose à garder à l'esprit.

3
Skyler

JWZ le dit mieux :

Quand [les gens] lisent du code et quand ils ont fini d'écrire du nouveau code, ils se soucient du nombre de colonnes d'écran dans lesquelles le code a tendance à mettre en retrait lorsqu'une nouvelle portée (ou sexpr, ou autre) s'ouvre ...

... Mon point de vue est que le meilleur moyen de résoudre les problèmes techniques est d’obliger le caractère de tabulation ASCII # 9) à ne jamais figurer dans les fichiers sur disque: programmez votre éditeur pour étendre les tabulations à un nombre approprié. des espaces avant d'écrire les lignes sur le disque ...

... Cela suppose que vous n'utilisez jamais les tabulations aux endroits où elles sont réellement significatives, comme dans les constantes chaîne ou caractère, mais je ne le fais jamais: lorsqu'il importe que ce soit une tabulation, j'utilise toujours '\ t' à la place.

2
Mark Cidade

Puisque python s'appuie sur l'indentation afin de reconnaître la structure du programme, une méthode claire d'identification est requise. C'est pourquoi vous devez choisir des espaces ou des tabulations.

Cependant, python a également pour principe de n’avoir qu’une seule façon de faire les choses. Il devrait donc exister une recommandation officielle concernant une seule façon de procéder à l’indentation.

Les espaces et les tabulations représentent un défi unique pour un éditeur à gérer en tant qu'indentation. Le traitement des onglets eux-mêmes n'est pas uniforme dans tous les éditeurs ou même les paramètres de l'utilisateur. Comme les espaces ne sont pas configurables, ils constituent le choix le plus logique car ils garantissent que le résultat sera identique partout.

1
Florian Bösch

Vous pouvez avoir votre gâteau et le manger. Configurez votre éditeur pour développer automatiquement les onglets en espaces.

(Ce serait :set expandtab dans Vim.)

0
Rod Daunoravicius

Mon hypothèse est que la plupart des éditeurs de texte Linux font par défaut que les valeurs par défaut sont ridiculement grandes. Je ne vois aucune autre bonne raison d'utiliser des espaces au-dessus des onglets.

0
brian cronrath

L’avantage le plus important que je puisse dire sur les espaces par rapport aux onglets est que beaucoup de programmeurs et de projets utilisent un nombre défini de colonnes pour le code source. la tabstop les longues lignes vont être trop long pour la fenêtre de l'éditeur d'autres personnes. Je conviens que les onglets sont plus faciles à utiliser, mais je pense que les espaces sont plus faciles pour la collaboration, ce qui est important pour un grand projet open source tel que Python.

0
sirwart