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.
python
indentation
quamrana
la source
la source
Réponses:
La réponse a été donnée ici même dans le PEP [ed: ce passage a été édité en 2013 ]. Je cite:
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:
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.]
la source
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.
la source
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.
la source
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.
la source
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.
la source
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.
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 .
la source
Notez que l'utilisation des onglets confond un autre aspect de PEP 8:
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):
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.
la source
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.
la source
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.
la source
JWZ le dit le mieux :
la source
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.
la source
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.
la source
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.)la source
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.
la source
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.
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.
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.
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.
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.
Bien sûr, ce qui précède peut également être bien écrit comme
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 ...]
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.
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.
la source
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.
la source
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).
la source