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


146

Je vois sur Stack Overflow et PEP 8 que la recommandation est d'utiliser des espaces uniquement pour l'indentation dans les programmes Python. Je peux comprendre la nécessité d'une indentation cohérente et j'ai ressenti cette douleur.

Y a-t-il une raison sous-jacente à la préférence des espaces? J'aurais pensé que les onglets étaient beaucoup plus faciles à utiliser.


7
Lisez la discussion PEP pour savoir.
e-satis le

106
1 niveau d'indentation est ... 1. Il est complètement illogique de devoir se mettre d'accord sur l'utilisation de N espaces alors que vous pourriez tous utiliser une seule tabulation. Ce qui, au fait, est exactement destiné à le faire. Retrait. Une fois que. 1 niveau d'indentation = 1 seul caractère, soit 1 seule tabulation. Et ils sont plus pratiques car chaque codeur peut choisir librement comment le visualiser. Utiliser des espaces est stupide, je n'ai jamais vu un seul argument pour cela qui ne soit pas stupide.
o0 '.

31
@BlueBomber et pourquoi ne pas forcer les gens à avoir une taille de police et un jeu de couleurs que vous aimez, pendant que vous y êtes? Toujours stupide.
o0 '.

10
@BlueBomber non, non, c'est EXACTEMENT sur le même niveau d'absurdité.
o0 '.

9
@BlueBomber Quelle est exactement la différence? Vous réduisez un degré de liberté dans la configuration d'un autre développeur de son environnement sans obtenir aucun avantage notable. Si vous voulez être un dictateur et forcer tout le monde à regarder le code avec un retrait correspondant à 2 ou 4 ou 29 espaces, vous pouvez toujours le faire avec des tabulations. Demandez simplement à vos subalternes de définir leur IDE pour afficher les onglets correspondant à votre nombre d'espaces préféré. Si vous n'avez pas le pouvoir de le faire, vous devriez peut-être les laisser décider par eux-mêmes de la largeur d'une unité d'indentation qui leur convient.
Asad Saeeduddin

Réponses:


111

La réponse a été donnée ici même dans le PEP [ed: ce passage a été édité en 2013 ]. Je cite:

Le moyen le plus courant d'indenter Python est d'utiliser uniquement des espaces.

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

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

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

L'intention est de faire en sorte que tout le code qui entre dans la distribution officielle de python soit formaté de manière cohérente (j'espère que nous pouvons convenir que c'est universellement une bonne chose ™).

Étant donné que la décision entre les espaces et les onglets 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 mettre fin à toute discussion: choisissez-en un .

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

À toutes autres fins, vous pouvez prendre ce PEP comme une recommandation, ou vous pouvez l'ignorer - votre choix, celui de votre équipe ou vos chefs d'équipe.

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


11
D'accord. La cohérence est plus importante que les tabulations vs les espaces X vs les espaces Y.
Mike Clark

10
me fait me demander ... pourquoi la bibliothèque standard a-t-elle autant de noms de méthodes mixedCase?
Kyle Wild

6
@dorkitude: a) personne n'est parfait. b) des raisons historiques.

8
Alors pourquoi tant de programmeurs ont-ils choisi d'utiliser des espaces avant PEP-8? C'est ce que je veux vraiment savoir. Les avantages des onglets me semblent évidents, mais pas des espaces.
einnocent


95

Eh bien, il semble que tout le monde soit 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 venue après les espaces. Il vous permet de mettre en retrait sans pousser l'espace des millions de fois ou en utilisant une fausse tabulation (qui produit des espaces).

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

Votre éditeur ne peut pas gérer correctement les onglets? Eh bien, procurez-vous un éditeur moderne . Il est peut-être temps, nous sommes maintenant au 21e siècle et le temps où un éditeur était un logiciel compliqué de haute technologie est révolu depuis longtemps. Nous avons maintenant des tonnes et des tonnes d'éditeurs parmi lesquels choisir, tous prenant en charge les onglets très bien. 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 une dispute? Eh bien, vous ne pouvez pas voir les espaces non plus!

Puis-je être si audacieux de suggérer d'avoir un meilleur éditeur? Un de ces high-tech, sorti il ​​y a déjà 10 ans, qui affiche des personnages invisibles ? (sarcasme éteint)

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

Mélanger les tabulations et les espaces est un argument non-non et sans argument à ce sujet. C'est un gâchis et ne peut jamais fonctionner.


26
Pour ajouter à cela, jetez un œil à votre clavier, le symbole de la touche TAB représente clairement l'indentation - c'est le but de la touche en retrait et non celui de l'ESPACE. PEP8 recommande d'utiliser des espaces est une erreur à mon humble avis mais ce n'est qu'une recommandation - en.wikipedia.org/wiki/Tab_character#Tab_characters
Daniel Sokolowski

29
J'étais entièrement d'accord avec ce message. L'utilisation d'espaces est pour les imbéciles qui aiment se faire trébucher sur ces erreurs d'indentation d'un espace. Si votre indentation était décalée d'un onglet, je vous garantis que vous le remarquerez.
septembre

12
@Zingham Personne ne peut utiliser les onglets exclusivement: les tabulations et les espaces sont toujours utilisés en combinaison et cela conduit à des incohérences. Moi-même et des milliers d'autres les utilisons de manière assez constante chaque jour. Tabulations pour l'indentation, espaces pour l'alignement. Quelle partie exactement de ce concept trouvez-vous si terriblement difficile à saisir, et pourquoi êtes-vous convaincu qu'il est impossible de l'appliquer de manière cohérente?
antred le

1
Le problème réel avec les tabulations est que vous ne pouvez pas obtenir l'indexation exacte du caractère recommandé par le même PEP8 sous le commentaire «# Aligné avec le délimiteur d'ouverture». C'est seulement la raison pour laquelle préférer les espaces: pour obtenir l'indentation correcte!
user541905

2
La question est "Pourquoi Python pep-8 recommande-t-il fortement les espaces sur les tabulations pour l'indentation?" . Cette réponse ne mentionne jamais rien sur le PEP8. ||| Au lieu d'essayer de répondre à la question ... cette réponse me semble être un énorme article d' opinion condescendant . Il y a 276 mots utilisés pour dire "les tabulations valent mieux que les espaces et voici pourquoi ...".
Trevor Boyd Smith

43

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 de document tandis que les espaces sont pour le contenu ou la délimitation entre les commandes dans le cas du code.

Je suis d'accord avec les commentaires de Jim selon lesquels les onglets ne sont pas vraiment le problème, ce sont les gens et la façon dont ils 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 plutôt que les préférences personnelles.


3
J'ai essayé de me forcer à utiliser des espaces aussi, mais les onglets de l'éditeur (au moins Eclipse + PyDev) gagnent en particulier si vous activez l'affichage des caractères invisibles. Et je peux facilement définir visuellement les onglets à 4, 8, 6 espaces. Donc, dans mon code au moins, j'évalue les préférences personnelles et je m'en tiens aux espaces si c'est la convention établie dans la base de code existante.
Daniel Sokolowski

2
C'est bien tant que vous ne codez pas en équipe. Une fois que vous êtes dans une équipe, vous vous entendez sur une seule convention et vous vous y tenez.
Soviut

1
@Soviut Cela me semble surtout être un vœu pieux. Dans toutes les équipes dans lesquelles je suis allé, la ligne officielle du parti était «utiliser des espaces». La réalité était que pratiquement chaque fichier était un désordre total à la fois d'onglets et d'espaces, et même dans les fichiers qui n'utilisaient systématiquement que des espaces ou uniquement des tabulations, l'indentation était toujours partout.
antred le

Ouais mais c'est ce que je voulais dire. Un certain consensus est finalement atteint et appliqué. Comme vous l'avez dit, il s'agit généralement de "n'utiliser que des espaces".
Soviut

c'est la raison principale pour laquelle je préfère les onglets. Il est logique d'avoir des caractères séparés pour la mise en page et la délimitation des mots
woojoo666

31

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

Chaque éditeur de texte décent a un "remplacer les onglets par des espaces" et de nombreuses personnes l'utilisent. Mais pas toujours.

Alors que certains éditeurs de texte peuvent remplacer une série d'espaces par une tabulation, c'est vraiment rare.

Conclusion . Vous ne pouvez pas vous tromper avec les espaces. Vous pourriez vous tromper avec les onglets. N'utilisez donc pas d'onglets et réduisez les risques d'erreurs.


15
Je ne jurerais jamais de faire quelque chose de la mauvaise façon simplement parce que beaucoup d'autres (personnes, éditeurs de texte, etc.) se trouvent également dans la mauvaise direction. En 2015, un éditeur de texte qui ne gère pas bien les onglets appartient à la poubelle.
antred

2
"Vous ne pouvez pas vous tromper avec les espaces. Vous pourriez vous tromper avec les onglets". J'ai trouvé que c'était incorrect à 100%. D'après mon expérience: "Vous ne pouvez pas vous tromper avec les onglets. Vous pourriez vous tromper avec les espaces" ... en particulier lors du partage de code.
cmroanirgo

5
Alors quelqu'un l'a finalement dit: utilisez des espaces car c'est le plus petit dénominateur commun. La même règle nous a amenés à conserver le MBR, le BIOS et les formulaires papier dans les bureaux gouvernementaux. Sauf que ceux-ci ont en fait des problèmes conceptuels, alors que les tabulations contre les espaces sont un problème d'utilisateur 100% stupide.
Milind R

1
Cela me semble un Argumentum ad populum: argument fallacieux qui conclut qu'une proposition est vraie parce que beaucoup ou la plupart des gens y croient. Parce que chaque éditeur peut remplacer les tabulations par des espaces, les espaces sont le bon choix est une erreur !!
Djunzu

28

Le problème avec les onglets est qu'ils sont invisibles et que les gens ne peuvent jamais s'entendre 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 disposition différente de celle que Python le voit. Et comme la disposition détermine les blocs, vous verrez une logique différente. Cela conduit à des bugs subtils.

Si vous insistez pour défier PEP 8 et utiliser des tabulations - ou pire, mélanger des tabulations et des espaces - lancez au moins toujours python avec l'argument '-tt', ce qui rend une indentation incohérente (parfois une tabulation, parfois un espace pour la même indentation level) une erreur. Aussi, si possible, configurez votre éditeur pour afficher les onglets différemment. Mais vraiment, la meilleure approche est de ne pas utiliser d'onglets, point final.


43
Il est vrai que les onglets sont invisibles et que les gens ne peuvent pas s'entendre sur la largeur des onglets. Mais il en va de même pour les espaces. Lorsque vous mélangez des tabulations et des espaces, les choses tournent mal. Mais pourquoi attribuez-vous cette situation aux onglets et non aux espaces?
Jim

47
Non, il n'en va pas de même pour les espaces. Les gens peuvent s'entendre sur la largeur des espaces.
Rafał Dowgird

32
Un seul espace peut toujours avoir la même largeur, mais l'indentation avec des espaces n'est pas toujours la même largeur. Je ne vois pas comment accepter d'utiliser des tabulations de n espaces de large est différent d'accepter de mettre en retrait avec n espaces.
Jim

26
Oui, je connais les problèmes que peut causer le mélange des deux. Ce que je ne comprends pas, c'est pourquoi certaines personnes blâment cela sur les onglets. Le problème est de les mélanger, pas des onglets en particulier. Vous pouvez résoudre le problème en remplaçant les tabulations par des espaces, mais vous pouvez également résoudre le problème en remplaçant les espaces par des tabulations.
Jim

70
Et non, si j'utilise des onglets de 8 larges et que vous utilisez des onglets de 6 larges, et que nous partageons du code, cela ne sera pas gâché. Ce n'est qu'un seul onglet pour l'interpréteur Python.
Jim

22

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 d'en recommander un, même si vous le choisissez en lançant une pièce.

Cependant, à mon humble avis, il y a quelques raisons mineures de favoriser les espaces par rapport aux onglets:

  • Différents outils. Parfois, le code est affiché en dehors de l'éditeur d'un programmeur. Par exemple. posté sur un groupe de discussion ou un forum. Les espaces font généralement mieux que les onglets ici - partout où les espaces sont mutilés, les onglets le font 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 quel côté vous êtes. Du côté positif, les développeurs peuvent afficher la source avec leur indentation préférée, de sorte qu'un développeur préférant le retrait de 2 espaces peut travailler avec un développeur de 8 espaces sur la même source et toujours la voir comme il le souhaite. L'inconvénient est qu'il y a des répercussions à cela - certaines personnes aiment le 8-space parce qu'il donne un retour très visible sur le fait qu'ils sont trop profondément imbriqués - ils peuvent voir le code archivé par le 2-indenter constamment enveloppé dans leur éditeur. Le fait que chaque développeur voit le code de la même manière conduit à plus de cohérence en ce qui concerne les longueurs de ligne, et d'autres problèmes également.

  • Indentation de ligne continue. Parfois, vous souhaitez indenter une ligne pour indiquer qu'elle est reportée 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 différents tabstops dans leur éditeur sans mélanger les espaces et les onglets. Cela tue efficacement l'avantage ci-dessus.

De toute évidence, il s'agit d'un problème profondément religieux, dont la programmation est en proie à des problèmes. Le problème le plus important est que nous devons en choisir un, même si ce n'est pas celui que vous préférez. Parfois, je pense que le plus grand avantage d'une indentation significative est qu'au moins nous sommes épargnés par les guerres de flammes.

Cet article de Jamie Zawinski sur la question mérite également d'être lu .


3
L'alignement est cependant trivial. J'utilise simplement les crochets comme un bloc et j'indente chaque argument. De plus, dans votre exemple, vous pouvez très bien utiliser des espaces puisque vous êtes dans une liste d'arguments et vous pouvez y empiler autant d'espaces que vous le souhaitez.
Soviut

3
@Soviut: Si vous indentez avec des espaces, l'alignement est foiré dès qu'il est visualisé avec une taille d'onglet différente. La seule façon de le préserver est d'utiliser des tabulations au niveau du retrait, puis des espaces pour le reste - c'est-à-dire mélanger les espaces et les tabulations, ce qui conduit à ses propres problèmes.
Brian

Ouais, c'est pourquoi j'ai tendance à utiliser de toute façon la convention python de l'indentation de bloc sur mes arguments. Bien sûr, ils peuvent ne pas s'aligner avec l'accolade ouverte, mais il est toujours clair à quelle ligne ou commande ils appartiennent. La syntaxe JQuery fonctionne sur un principe similaire.
Soviut

2
@Brian: Je ne vois pas comment cela mène à des problèmes. C'est exactement la bonne façon, des tabulations pour l'indentation, des espaces pour l'alignement. Ce n'est pas du tout la même chose que de mélanger des espaces et des tabulations pour l' indentation .
antred le

1
@CoreDumpError Euh non, certainement pas. Je le sais parce que Python 3 ne se plaint jamais d'aucun de mes scripts et que j'utilise des tabulations pour l'indentation / les espaces pour aligner tout le temps. De plus, PEP8 ne peut rien «interdire», car il ne s'agit que d'une recommandation (et une recommandation irréfléchie, à mon avis).
après le

12

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

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

Disons, hypothétiquement, que vous utilisez une largeur de tabulation de 2 et 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 le PEP l'indique):

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 facilement 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-sucky devrait avoir une option pour utiliser des espaces comme s'il s'agissait de tabulations (à la fois pour l'insertion et la suppression), donc cela ne devrait vraiment pas être un argument valide.


7

La réponse à la question est: PEP-8 veut faire une recommandation et a décidé que puisque les espaces sont plus populaires, il recommandera fortement les espaces sur les onglets.


Remarques sur PEP-8

PEP-8 dit «Utilisez 4 espaces par niveau d'indentation».
Il est clair que c'est la recommandation standard.

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

«Ne mélangez jamais les onglets et les espaces.»
Il s'agit d'une interdiction claire de mélanger - je pense que nous sommes tous d'accord là-dessus. Python peut détecter cela et s'étouffe souvent. L'utilisation de l'argument -tt en fait une erreur explicite.

«Le moyen le plus courant d'indenter Python est d'utiliser uniquement des espaces. La deuxième méthode la plus populaire consiste à utiliser uniquement les onglets.
Cela indique clairement que les deux sont utilisés. Pour être très clair: vous ne devez toujours jamais mélanger les espaces et les tabulations dans le même fichier.

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


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

Je pensais que j'allais essayer de travailler avec les espaces. Dans mon éditeur, j'ai configuré un type de fichier pour utiliser exclusivement des espaces et il insère donc 4 espaces si j'appuie sur tabulation. Si j'appuie trop souvent sur la tabulation, 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.

Ne pourrait-on pas dire à Python de considérer les tabulations comme des espaces n lors de sa lecture des indentations? Si nous pouvions nous mettre d'accord sur 4 espaces par indentation et 4 espaces par tabulation et permettre à Python d'accepter cela, alors il n'y aurait aucun problème.
Nous devons trouver des solutions gagnant-gagnant aux problèmes.


1
Quel éditeur utilisez-vous? La plupart des choses que j'ai utilisées ont une option pour déduire le retour arrière (emacs se comporte de cette façon par exemple), quelle que soit l'implémentation de l'indentation.
Brian le

Vous avez raison - je ne vois pas d'option pour déduire le retour arrière, mais vous pouvez probablement le gérer en utilisant shift-tab, ou réduire le retrait (ctrl-shift-i par défaut) à la place.
Brian

J'essaye juste PyScripter qui semble bien mieux utiliser les espaces lorsque vous appuyez sur la touche tab et les supprimer en 4 lorsque vous appuyez sur retour arrière.
quamrana

28
"Je dois supprimer les espaces! Arrgh! Quatre fois plus de suppressions que d'onglets!" - C'est la seule raison pour laquelle j'utilise les onglets pour tout, et pourquoi je pense que les gens qui utilisent des espaces sont fous. :) Je n'ai jamais eu de problèmes, sauf lorsque je colle quelque chose depuis le Web qui utilise des espaces. Ensuite, une simple recherche-remplacement corrige cela.
Aphex

3

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, j'avais maintenant 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 quelque chose à garder à l'esprit.


2

JWZ le dit le mieux :

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

... Mon opinion est que la meilleure façon de résoudre les problèmes techniques est d'exiger que le caractère ASCII # 9 TAB n'apparaisse jamais dans les fichiers disque: programmez votre éditeur pour étendre les tabulations à un nombre approprié d'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 de chaîne ou de caractère, mais je ne le fais jamais: quand il s'agit d'un onglet, j'utilise toujours '\ t' à la place.


10
Je ferais le contraire: les onglets ont une signification sémantique pour l'indentation, il est donc plus ressenti d'avoir des onglets stockés et des espaces affichés. L'utilisateur peut choisir un style de mise en forme et l'éditeur développera les onglets en conséquence.
AkiRoss du

1
Vous avez toujours le problème des tabulations et des espaces mixtes, ainsi qu'un auteur utilisant 1 colonne par onglet et indentation 4+ fois, ce qui semblerait fou dans un éditeur de texte configuré pour afficher chaque caractère de tabulation sur 4 colonnes de large. Les tabulations pour l'indentation ont le plus de sens dans un éditeur de texte à largeur variable, comme un traitement de texte utilisant des polices à espacement proportionnel. Pas tellement avec un éditeur de texte à largeur fixe.
Mark Cidade

2
Non, je voulais dire qu'un éditeur de texte devrait être capable d'analyser la grammaire de la langue et de comprendre quand une tabulation se produit, de sorte que les tabulations puissent être utilisées comme seul moyen de formatage et qu'il n'y aurait pas besoin d'utiliser des espaces pour l'indentation. "tab" n'est pas obligé d'avoir une largeur fixe, et je trouve généralement honteux qu'avec les techniques d'aujourd'hui (par exemple l'apprentissage automatique), le formatage reste un problème pour les programmeurs. Tout doit être automatisé, automatisé et transparent.
AkiRoss

Je ne vois pas comment il pourrait comprendre cela.
Mark Cidade

1

Puisque python s'appuie sur l'indentation pour reconnaître la structure du programme, un moyen clair d'identifier l'identification est nécessaire. C'est la raison pour laquelle choisir des espaces ou des tabulations.

Cependant, python a également une philosophie forte de n'avoir qu'une seule façon de faire les choses, il devrait donc y avoir une recommandation officielle pour une façon de faire l'indentation.

Les espaces et les tabulations posent des défis uniques pour un éditeur à gérer comme indentation. La gestion des onglets eux-mêmes n'est pas uniforme entre les éditeurs ou même les paramètres utilisateur. Comme les espaces ne sont pas configurables, ils posent le choix le plus logique car ils garantissent que le résultat sera partout le même.


8
Et puisque chaque éditeur peut également choisir son jeu de couleurs, pensez-vous qu'il devrait également indiquer le jeu de couleurs à utiliser?
o0 '.

8
Oui, mais cette incohérence n'a-t-elle pas plus de sens? Parce que c'est simplement une question de préférence visuelle. Si je préfère un retrait "à la recherche" plus grand dans mon éditeur, je peux définir mes onglets sur 8 espaces, si je préfère moins, je peux le définir sur 2. De cette façon, le code, sans modifier réellement la mise en forme, convient mieux à l'individu qui est l'observer.
dennmat

8
Je suis d'accord avec dennmat - Si je préfère visuellement 2 espaces et que Guido préfère visuellement 4 espaces, alors le choix logique est d'utiliser l'indentation par tabulation.
septembre

0

L'avantage le plus significatif que je puisse dire des espaces par rapport aux onglets est que de nombreux programmeurs et projets utilisent un nombre défini de colonnes pour le code source, et si quelqu'un commet un changement avec son arrêt de tabulation défini sur 2 espaces et le projet utilise 4 espaces comme le tabstop les longues lignes vont être trop longues 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 sur un grand projet open source comme Python.


2
c'est faux: cela ne se produit que si vous mélangez des tabulations et des espaces, et vous le résoudriez également en forçant tout le monde à utiliser des tabulations au lieu d'espaces.
o0 '.

0

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

(Ce serait :set expandtabà Vim.)


0

Je suppose que la plupart des éditeurs de texte Linux donnent par défaut une apparence ridiculement grande aux valeurs par défaut. Je ne peux penser à aucune autre bonne raison d'utiliser des espaces sur les onglets.


-1

Outre toutes les autres raisons déjà citées (cohérence, ne jamais mélanger les espaces et les tabulations, etc.), je crois qu'il y a encore quelques raisons à noter pour la convention des 4 espaces. Celles-ci ne s'appliquent qu'à Python (et peut-être à d'autres langages où l'indentation a un sens). Les onglets peuvent être plus agréables dans d'autres langues, en fonction des préférences individuelles.

  1. Si un éditeur n'affiche pas d'onglets (ce qui se produit, selon la configuration, dans un certain nombre), un autre auteur peut supposer que votre code utilise 4 espaces, b / c presque tout le code Python disponible publiquement le fait; si ce même éditeur a une largeur de tabulation de 4, des choses désagréables peuvent arriver - au moins, cette personne pauvre perdra du temps à cause d'un problème d'indentation qui aurait été très facile à éviter en s'en tenant à la convention. Donc pour moi, la raison numéro un est d'éviter les bugs avec cohérence.

  2. En recadrant la question de savoir lequel est le meilleur, onglets ou espaces, il faut se demander quels sont les avantages des onglets; J'ai vu de nombreux articles faisant l'éloge des onglets, mais peu d'arguments convaincants pour eux; les bons éditeurs comme emacs, vi (m), kate, ... font une indentation appropriée en fonction de la sémantique de votre code - même sans tabulations; les mêmes éditeurs peuvent facilement être configurés pour annuler l'indentation sur le retour arrière, etc.

  3. Certaines personnes ont de très fortes préférences en ce qui concerne leur liberté de décider de l'aspect / de la mise en page du code; d'autres valorisent la cohérence par rapport à cette liberté. Python réduit considérablement cette liberté en dictant que l'indentation est utilisée pour les blocs, etc. Cela peut être vu comme un bogue ou une fonctionnalité, mais cela vient en quelque sorte avec le choix de Python. Personnellement, j'aime cette cohérence - quand on commence à coder sur un nouveau projet, au moins la mise en page est proche de ce à quoi je suis habitué, donc c'est assez facile à lire. Presque toujours.

  4. L'utilisation d'espaces pour l'indentation permet des «astuces de mise en page» qui peuvent faciliter la compréhension du code; quelques exemples de ceux-ci sont énumérés dans PEP8; par exemple.

    foo = long_function_name(var_one, var_two,
                             var_three, var_four)
    
    # the same for lists
    a_long_list = [1,
                   2,
                   # ...
                   79]
    
    # or dictionaries
    a_dict = {"a_key": "a_value",
              "another_key": "another_value"}

    Bien sûr, ce qui précède peut également être bien écrit comme

    foo = long_function_name(
        var_one, var_two,
        var_three, var_four)
    
    # the same for lists
    a_long_list = [
        1,
        2,
        # ...
        79]
    
    # or dictionaries
    a_dict = {
        "a_key": "a_value",
        "another_key": "another_value"}

    Cependant, ce dernier prend plus de lignes de code et moins de lignes sont parfois considérées comme meilleures (b / c vous obtenez plus sur un seul écran). Mais si vous aimez l'alignement, les espaces (de préférence assistés par un bon éditeur) vous donnent, en un sens, plus de liberté en Python que les tabulations. [Eh bien, je suppose que certains éditeurs vous permettent de faire la même chose avec les onglets;) - mais avec des espaces, tous le font ...]

  5. Revenons au même argument que tout le monde fait - PEP 8 dicte (ok, recommande fortement) les espaces. Si vous arrivez à un projet qui n'utilise que des onglets, bien sûr, vous avez peu de choix. Mais en raison de la mise en place des conventions PEP 8, presque tous les programmeurs Python sont habitués à ce style. Cela rend tellement plus facile de trouver un consensus sur un style qui est accepté par la plupart des programmeurs ... et avoir des individus d'accord sur le style pourrait être très difficile autrement.

  6. Les outils qui aident à appliquer le style sont généralement conscients de PEP 8 sans effort supplémentaire. Ce n'est pas une bonne raison, mais c'est juste agréable de faire fonctionner les choses dès le départ.


-3

Le problème universel avec les onglets est qu'ils peuvent être représentés différemment dans différents environnements.
Dans un éditeur donné, un onglet peut avoir 8 espaces ou 2.
Dans certains éditeurs, vous pouvez contrôler cela, tandis que dans d'autres, vous ne pouvez pas.

Un autre problème avec les onglets est la façon dont ils sont représentés dans la sortie imprimée. Je crois que la plupart des imprimeurs interprètent un onglet comme 8 espaces.

Avec les espaces, il n'y a aucun doute. Tout s'alignera comme l'auteur l'a prévu.


14
Un autre qui a fondamentalement mal compris l'onglet ... procurez-vous une machine à écrire mécanique et jouez avec pendant un moment, vraiment! 1 onglet n'est pas égal à 8 espaces! il est égal à up_to_8_spaces ! otoh: avec les polices proportionnelles, les onglets sont le seul moyen de garantir l'alignement.

3
"Dans un éditeur donné, un onglet peut avoir 8 espaces ou 2". Si j'aime 4 espaces et que mon ami aime 8 espaces ou 2 espaces ou 3 espaces ou, etc. Alors nous pouvons tous les deux nous mettre d'accord sur les tabulations car (étant dédicacé indentation ,) l'éditeur sait ce qu'ils sont et peut les afficher en conséquence. Je vois le code avec des retraits de 4 espaces de large, vous le voyez avec des retraits de 8 espaces de large, notre étrange ami utilise ses 3 espaces, et tout est cool. Les circonstances (en particulier en Python!) Où la largeur de l'onglet elle-même aurait de l'importance sont si rares que même les partisans de l'espace les évoquent rarement.
JamesTheAwesomeDude

-4

Sur la discussion entre Jim et Thomas Wouters dans les commentaires.

Le problème était ... puisque la largeur des onglets et des espaces peut varier - et puisque les programmeurs ne peuvent s'entendre sur aucune largeur - pourquoi les onglets portent-ils le blâme.

Je suis d'accord avec Jim sur ce point - les onglets ne sont PAS mauvais en eux-mêmes. Mais il y a un problème...

Avec des espaces, je peux contrôler l' apparence de "MON PROPRE CODE" dans TOUS les éditeurs du monde. Si j'utilise 4 espaces - quel que soit l'éditeur dans lequel vous ouvrez mon code, il aura la même distance par rapport à la marge gauche. Avec les onglets, je suis à la merci du paramètre de largeur de tabulation pour l'éditeur - même pour MON PROPRE CODE. Et je n'aime pas ça.

Ainsi, même s'il est vrai que même les espaces ne peuvent garantir la cohérence - ils vous permettent au moins de mieux contrôler l'apparence de votre propre code partout - ce que les onglets ne peuvent pas.

Je pense que ce n'est PAS la cohérence des programmeurs qui écrivent le code - mais la cohérence des éditeurs montrant ce code - que les espaces facilitent la réalisation (et l'imposition).


6
Vous êtes «à la merci du paramètre de largeur de tabulation pour l'éditeur»? Si votre éditeur ne vous permet pas de définir la largeur de tabulation souhaitée, vous utilisez peut-être
notepad.exe

4
@zigg Cela n'a absolument rien à voir avec l'argument, car il (elle?) parle spécifiquement de son propre code (cette information est même en gras, en italique et en majuscules). Nulle part dans la discussion le partage de code n'est pertinent.
user137369

1
Les éditeurs ne sont pas les seuls outils avec lesquels afficher le code. Il y a aussi des diffs, des traces, Github et d'autres pages Web, et ainsi de suite qui choisiront tous une certaine largeur d'onglet hors de votre contrôle (probablement 8).
RemcoGerlich

Je vois ce que tu veux dire. Vous contrôlez en effet la façon dont tout le monde voit votre code (en ce qui concerne l'indentation). Votre prochaine étape consiste à contrôler le type de police et la coloration que tout le monde utilisera pour voir votre code. Après cela, vous êtes prêt à dominer le monde lui-même et pas seulement les éditeurs de code !!
Djunzu
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.