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

Explication Illustrative de la Faute, de l'Erreur, de la Défaillance, du Bug et du Défaut Logiciel

Explication Illustrative de la Faute, de l’Erreur, de la Défaillance, du Bug et du Défaut Logiciel

Les logiciels ne se comportent pas toujours comme prévu. Des erreurs dans l’implémentation ou dans la spécification des exigences peuvent provoquer des problèmes dans les logiciels. Les terminologies courantes utilisées pour décrire ces problèmes sont Faute, Erreur, Défaillance, Bug et Défaut.

Lire la suite