Le bug que j'ai rencontré quand j'ai oublié un `return` en Python

Le bug que j’ai rencontré quand j’ai oublié un return en Python

Je suis déjà tombé sur un bug sournois en Python : ma fonction retournait None alors que j’attendais une valeur. La cause ? J’avais tout simplement oublié le mot-clé return.

Voici un exemple simplifié qui illustre le problème :

1def get_data():
2    # Devait retourner une liste
3    [1, 2, 3]  # Oups ! 'return' oublié ici

Pourquoi les fonctions Python retournent None

À première vue, on pourrait penser que get_data() renvoie [1, 2, 3]. En réalité, la fonction retourne None! Pourquoi?

  • En Python, pas de return, return seul et return None sont équivalents — tous renvoient None.
  • Écrire une expression seule (comme [1, 2, 3]) ne fait rien avec sa valeur : elle est évaluée puis ignorée.

Ce comportement paraît évident une fois qu’on le connaît, mais il est facile de se tromper, surtout si vous utilisez aussi des langages comme Rust, où la dernière expression d’une fonction est renvoyée automatiquement.

Cette habitude peut facilement causer ce genre de bug en Python.

Les fonctions peuvent avoir plusieurs points de retour :

1def example(x):
2    if x > 0:
3        return x
4    else:
5        return -x

Python s’arrête dès qu’il rencontre un return lors de l’exécution.

Si un chemin d’exécution atteint la fin de la fonction sans rencontrer de return, Python retourne None :

1def maybe_return(x):
2    if x > 0:
3        return x
4    # pas de else et pas de return à la fin
5
6print(maybe_return(5))   # affiche 5
7print(maybe_return(-1))  # affiche None

Cela peut provoquer des bugs si votre code s’attend à une valeur non-None mais reçoit None de manière inattendue.

Tip

Leçons à retenir

  • Toujours utiliser return explicitement lorsque vous voulez renvoyer une valeur.
  • Rappelez-vous qu’une fonction Python retourne None par défaut si vous oubliez returnpas de return, return seul ou return None signifient tous la même chose.
  • Si vous utilisez Rust ou des langages similaires, souvenez-vous que Python ne renverra pas automatiquement la dernière expression.
  • Pensez à ajouter des annotations de type et à utiliser des outils d’analyse statique (comme ty). J’ai listé plus d’options dans mon article Ressources d’apprentissage Python, utiles pour détecter les return manquants.
1def maybe_return(x: int) -> int | None:
2    if x > 0:
3        return x
4    # pas de return si x <= 0
  • Écrivez des tests unitaires couvrant toutes les branches pour détecter rapidement les valeurs None inattendues.

Avec ces conseils, vous devriez éviter l’erreur minime mais sournoise d’une fonction Python qui retourne None parce que vous avez oublié return !

Articles Connexes

Le Guide Définitif des Triples Guillemets en Python : Multiligne, Guillemets Internes et Docstring

Le Guide Définitif des Triples Guillemets en Python : Multiligne, Guillemets Internes et Docstring

Les triples guillemets (""" ou ''') en Python sont d’une simplicité trompeuse — mais d’une puissance incroyable. Ils permettent :

Lire la suite
`1ms` : La Fausse Promesse de `sleep()` pour le Code Temps Réel — Résolution et Jitter Réparées

1ms : La Fausse Promesse de sleep() pour le Code Temps Réel — Résolution et Jitter Réparées

Si vous avez déjà créé un système en temps réel, un simulateur de données ou une boucle de jeu, vous avez probablement essayé d’utiliser sleep() pour contrôler le timing.

Lire la suite