Aller au contenu

Bonnes pratiques de codage⚓︎

Définitions⚓︎

PEP⚓︎

PEP signifie Python Enhancement Proposal, et il y en a plusieurs. Un PEP est un document qui décrit les nouvelles fonctionnalités proposées pour Python et documente les aspects de Python, comme la conception et le style, pour la communauté.

Tiret bas⚓︎

Connu en anglais comme underscore, on trouve ce caractère avec la touche du clavier 8_\

Il ne faut pas dire « tiret du 8 » ; cela n'est valable que sur certains claviers...

snake_case⚓︎

Le snake case est une convention typographique en informatique consistant à écrire des ensembles de mots, généralement, en minuscules en les séparant par des tirets bas.

Exemple : un_joli_nom_de_variable

camel case⚓︎

Le camel case consiste à mettre en majuscule les premières lettres de chaque mot, sans séparer par un tiret bas.

Exemple : UnNomDeClasse

PEP 8⚓︎

PEP 8, parfois orthographié PEP8 ou PEP-8, est un document qui fournit des directives et des meilleures pratiques sur la façon d’écrire du code Python. Il a été écrit en 2001 par Guido van Rossum (le créateur de Python), Barry Varsovie et Nick Coghlan. L’objectif principal de PEP 8 est d’améliorer la lisibilité et la cohérence du code Python.

Les identifiants⚓︎

  1. On utilisera le snake_case pour toutes les variables, sauf :

    • pour les class que l'on nomme en camel case,
    • pour les constantes, en majuscule.
  2. On donne des identifiants qui ont un sens.

# mal
p = (5, 8)
x, y = p

# mieux
point_P = (5, 8)
point_P_x, point_P_y = point_P

Aération du code⚓︎

  • L'indentation doit être de 4 espaces.
  • Une ligne vide après une définition de fonction.
  • Deux lignes vides après une définition de classe.
  • Une ligne vide pour séparer deux étapes marquées d'un groupe d'instructions.
  • Une ligne vide pour aérer chaque doctest.
  • Maximum 79 caractères de code par ligne.
    • Une ligne trop longue peut être coupée sans problème à l'intérieur de parenthèses, crochets ou accolades ; on parle de continuation implicite.
    • Sinon, on peut toujours couper une ligne avec \.
    • La continuation implicite est à privilégier dès que possible !
# continuation implicite
def ma_fonction(argument_1,
                argument_2, argument_3, argument_4):
    pass

# ligne coupée avec \
ma_fonction(22, 23, 24, 25) + \
    ma_fonction(34, 35, 36, 37)

Aération des opérateurs⚓︎

On met de l'espace autour des opérateurs binaires, sauf

  • pour les paramètres par défaut des fonctions,
  • pour les opérations prioritaires
  • pour : dans les définitions de tranches
# Mal
x = a*b+c
if x > 5 and x % 2 == 0:
    print('x est plus grand que 5 et divisible par 2.')

# moyen
x = a * b + c
if x>5 and x%2==0:
        print('x est plus grand que 5 et divisible par 2.')

# bien
x = a*b + c
if (x > 5) and (x % 2 == 0):
        print('x est plus grand que 5 et divisible par 2.')

On met une espace :

  • juste après une virgule
mon_tuple = (4, 11, 25)

On ne met pas d'espace

  • juste après une parenthèse ouvrante (ou crochet, ou accolade)
  • juste avant une parenthèse fermante (idem).

On ne place jamais d'espace en fin de ligne.

Un peu plus encore⚓︎

Inspiré de ce document, vous retrouverez plus de détails. Une recommandation y est faite, elle fait débat. Les deux exemples suivant utilisent de la conversion implicite ; nous ne le recommandons pas ! Nous montrons ensuite la bonne pratique.

# Non recommandée
ma_liste = []
if not len(my_list):
    print('ma_liste est vide !')

En Python, toute liste, chaîne ou tuple vide est convertie implicitement à False.

Il est donc possible de proposer une alternative plus simple à ce qui précède :

# Non recommandée non plus, mais vue souvent !
ma_liste = []
if not ma_liste:
    print('ma_liste est vide !')

Alors que les deux exemples afficheront que la liste est vide, la deuxième option est plus simple, donc PEP 8 l’encourage.

⚠️ Contrairement au PEP 8, nous préférons interdire la conversion implicite, donc une autre méthode est recommandée.

# La bonne méthode
ma_liste = []

if ma_liste == []:
    print("ma_liste est vide !")
# ou alors
if ma_liste != []:
    print("ma_liste n'est pas vide !")