Python >> Tutoriel Python >  >> Python

PEP 8 :Indentation suspendue et crochets fermants en Python

Les puristes de PEP 8 sont prêts à vous attaquer, vous et votre code, s'ils vous surprennent à ne pas respecter la norme PEP 8. Par exemple, les codeurs Python placent leurs accolades, crochets ou parenthèses sur une ligne séparée pour faciliter la compréhension des listes imbriquées ou des dictionnaires.

Cet article montre comment aligner correctement les accolades fermantes, les crochets et les parenthèses en Python. C'est ce qu'on appelle "l'indentation suspendue" et c'est au cœur du code propre et standardisé de la PEP 8, facile à lire et à comprendre !

Un exemple rapide montre comment créer une construction multiligne conforme à la norme PEP 8 :

# PEP 8 Compliant
age = {
    'Alice': 24,
    'Bob': 28,
    'Ann': 26,
    }

Alors, comment définir correctement les données d'une liste ou d'un dictionnaire entre accolades, crochets et parenthèses ?

Selon la norme PEP 8, il existe deux façons d'aligner les accolades fermantes, les crochets ou les parenthèses. Tout d'abord, alignez-le avec le premier caractère non blanc de la ligne précédente. Deuxièmement, alignez-le avec le premier caractère qui commence la construction multiligne.

Cela semble un peu déroutant, alors passons aux exemples pratiques.

Où placer l'accolade fermante, le crochet ou la parenthèse ?

Pour les constructions multilignes, il existe deux options de base sur la manière d'utiliser correctement les données.

1. Alignez l'accolade fermante avec le premier caractère non blanc de la ligne précédente :

# PEP 8 Compliant
age = {
    'Alice': 24,
    'Bob': 28,
    'Ann': 26,
    }

2. Alignez l'accolade fermante avec le premier caractère qui commence la construction multiligne :

# PEP 8 Compliant
age = {
    'Alice': 24,
    'Bob': 28,
    'Ann': 26,
}

Les deux modes d'indentation sont également valables selon la norme PEP 8. Mais notez que dans tous les cas, les accolades ouvrantes et fermantes (crochets, parenthèses) doivent être placées sur leur propre ligne. Ainsi, ce qui suit constituerait une violation de la norme PEP 8 :

# NOT PEP 8 COMPLIANT
age = {'Alice': 24,
       'Bob': 28,
       'Ann': 26,
       }

La raison en est que les accolades ouvrantes et fermantes (crochets, parenthèses) doivent être placées sur leur propre ligne.

Cependant, la norme PEP 8 permet de NE PAS placer les accolades ouvrantes et fermantes (crochets, parenthèses) dans leur propre ligne - SI les arguments ou les éléments s'alignent. Voici trois exemples conformes à la PEP 8 :

# PEP 8 Compliant
def f(argument_1, argument_2,
      argument_3, argument_4):
    None


# PEP 8 Compliant
def f(argument_1,
      argument_2,
      argument_3,
      argument_4):
    None


# PEP 8 Compliant
def f(argument_1, argument_2, argument_3, argument_4):
    None

Bien que les parenthèses d'ouverture et de fermeture ne soient pas placées sur leurs propres lignes, elles sont toujours conformes à la PEP 8 car les arguments s'alignent dans les deux premiers exemples.

Le code interactif suivant n'est pas encore prêt. Cela nécessite votre superpuissance de débogage :

Exercice :déboguer le code pour qu'il s'exécute. Quelle méthode d'indentation préférez-vous ?

Pourquoi terminer la liste Python avec une virgule de fin ?

Nous avons vu de nombreux exemples de constructions multilignes où il y a une virgule après le dernier élément de la liste :

# PEP 8 Compliant
age = {
    'Alice': 24,
    'Bob': 28,
    'Ann': 26,
    }

La virgule de fin après la dernière ligne du dictionnaire ('Ann' : 26, ) est facultatif selon la norme PEP 8.

Attention : vous trouverez de nombreux avis sur le web où des "experts" vous disent que la virgule finale est obligatoire (comme ici). Mais ce n'est pas explicitement indiqué dans la norme. En fait, la norme vous recommande d'utiliser la virgule si vos "éléments [sont] censés être étendus dans le temps" (la source). Dans ce cas, il est plus facile de copier et coller de nouveaux éléments dans la liste (ou le dictionnaire) sans avoir à ajouter manuellement une virgule à l'ancien dernier élément et à supprimer la virgule après le nouveau dernier élément.

En d'autres termes, la construction multiligne suivante est également valide et suit implicitement la norme PEP 8 :

# PEP 8 Compliant
age = {
    'Alice': 24,
    'Bob': 28,
    'Ann': 26
    }

Notez que la virgule de fin est manquante. Mais si vous ne prévoyez pas d'étendre votre liste au fil du temps, vous pouvez l'utiliser, même si certains vérificateurs de style de code Python ("Linters") se plaignent.

Constructions multilignes imbriquées

Maintenant, il vous suffit de décider laquelle des méthodes ci-dessus vous préparez pour écrire des accolades ouvrantes et fermantes, des crochets ou des parenthèses. Voici comment vous pouvez les imbriquer et vous conformer à la norme PEP 8 :

# PEP 8 Compliant
data = [
    'string',
    42,
    {
        1: '1',
        2: '2',
        42: '21',
    },
    (1, 2, 3),
    (
        [1, 2, 3],
        [4, 5, 6],
    )
]

Vous voyez que nous plaçons chaque accolade, crochet et parenthèse sur une seule ligne. La ligne suivante commence par quatre indentations d'espacement. Vient ensuite l'élément, suivi d'une virgule. L'élément lui-même peut également être une construction multiligne. Mais si vous comprenez comment écrire une construction multiligne, vous comprendrez également comment les imbriquer.

Questions similaires

Les accolades doivent-elles apparaître sur leur propre ligne ?

Oui, ils doivent apparaître sur leur propre ligne. Une exception est si vous écrivez toute la séquence d'éléments sur une seule ligne. Dans ce cas, l'accolade fermante, le crochet ou la parenthèse doit également apparaître à la fin de la même ligne.

Où placer l'accolade fermante ?

Comme indiqué précédemment, vous l'alignez avec le premier caractère non blanc de la ligne précédente ou avec le premier caractère qui commence la construction multiligne.

Règle Flake-8 :ligne de continuation non alignée pour le retrait négatif (E131)

Il s'agit d'une erreur courante de l'analyseur de code Flake-8. Une ligne de continuation n'est pas alignée pour le retrait négatif.

Anti-pattern :

# NOT PEP 8 Compliant
my_dict = {
    "key": "value",
    "long": "the quick brown fox jumps over the "
        "lazy dog",
}

Meilleure pratique :

# PEP 8 Compliant
my_dict = {
    "key": "value",
    "long": "the quick brown fox jumps over the "
            "lazy dog",
}

L'art du code propre

La plupart des développeurs de logiciels perdent des milliers d'heures à travailler avec du code trop complexe. Les huit principes fondamentaux de The Art of Clean Coding vous apprendront à écrire un code clair et maintenable sans compromettre les fonctionnalités. Le principe directeur du livre est la simplicité :réduisez et simplifiez, puis réinvestissez de l'énergie dans les parties importantes pour vous faire gagner d'innombrables heures et faciliter la tâche souvent onéreuse de maintenance du code.

  1. Concentrez-vous sur l'essentiel avec le principe 80/20 — concentrez-vous sur les 20 % de votre code qui comptent le plus
  2. Évitez de coder de manière isolée :créez un produit minimum viable pour obtenir des commentaires rapides
  3. Écrivez le code proprement et simplement pour éliminer l'encombrement
  4. Éviter une optimisation prématurée qui risque de trop compliquer le code
  5. Équilibrez vos objectifs, vos capacités et vos commentaires pour atteindre l'état productif de Flow
  6. Appliquez le bien faire une chose philosophie pour améliorer considérablement la fonctionnalité
  7. Concevez des interfaces utilisateur efficaces avec Moins c'est plus principe
  8. Regroupez vos nouvelles compétences en un seul principe unificateur :Concentrez-vous

L'art du codage propre basé sur Python convient aux programmeurs de tous niveaux, avec des idées présentées de manière indépendante du langage.



Post précédent