Comprendre la surcharge des fonctions en Python
La surcharge de fonction est une fonctionnalité de certains langages de programmation qui vous permet de définir des variantes de la même fonction. Chaque variante a le même nom, mais des implémentations différentes, avec des signatures de fonction uniques.
Cette technique vous permet d’effectuer différentes opérations en fonction du type et du nombre d’arguments passés à une fonction.
Contrairement à des langages tels que C++ et Java, Python ne prend pas en charge la surcharge des fonctions par défaut, mais il existe des moyens d’obtenir une fonctionnalité similaire.
Comment Python gère-t-il la surcharge des fonctions ?
En Python, vous pouvez définir la même fonction plus d’une fois avec des paramètres, des types de données ou les deux différents dans chaque définition. Cependant, Python ne reconnaîtra que la dernière définition de la fonction lorsque vous l’appellerez. Voici un exemple :
Les langages orientés objet, comme Java, prennent souvent en charge la surcharge des fonctions et des méthodes. Une méthode est simplement une fonction que vous définissez à l’intérieur d’une classe.
Dans le code ci-dessus, Python ne reconnaît que la deuxième définition de la fonction arithmétique() lorsque vous essayez de l’appeler dans votre projet. Si vous essayez d’appeler la fonction avec deux arguments tels qu’ils ont été définis en premier lieu, vous obtiendrez une erreur qui dira « missing required positional arguments » (manque d’arguments positionnels requis).
Vous n’obtiendrez pas d’erreur si vous appelez la fonction avec quatre arguments. Cela signifie que Python a écrasé la fonction avec sa dernière instance. Ce n’est pas le comportement de la surcharge, vous devez donc vous y attaquer.
Ainsi, Python ne gère pas la surcharge des fonctions par défaut, mais il existe quelques astuces que vous pouvez utiliser pour simuler son comportement dans vos programmes.
Méthode 1 : Utilisation de paramètres optionnels ou d’arguments par défaut
Vous pouvez obtenir une surcharge en définissant une fonction avec des arguments par défaut. Voici un exemple :
Cette fonction a trois paramètres, mais deux d’entre eux ont des valeurs par défaut. Cela signifie que vous pouvez l’appeler avec un à trois arguments :
Bien que cette approche vous permette d’appeler la fonction de plusieurs manières différentes, elle n’est pas très efficace à long terme. Voici quelques-unes de ses limites :
- Vous ne pouvez passer que des arguments qui sont soit des entiers, soit des flottants.
- Il n’y a pas de changement significatif dans le comportement de la fonction. Par exemple, vous ne pouvez pas modifier son comportement pour calculer l’aire d’une forme ou même imprimer Hello World.
Méthode 2 : utilisation d’arguments variables
Pour utiliser des arguments variables pour la surcharge de fonction en Python, vous devez inclure le paramètre args lors de la définition de votre fonction. Le paramètre args vous permet de passer plusieurs arguments positionnels lors de l’appel de votre fonction. Voici un exemple :
La fonction ci-dessus prend deux arguments : un argument obligatoire appelé a et l’argument args qui vous permet de saisir autant d’arguments que nécessaire.
Bien qu’elle puisse prendre plusieurs arguments, la fonction ci-dessus ne peut effectuer l’opération de multiplication que sur les arguments variables, c’est-à-dire les arguments représentés par l’argument args .
Si vous souhaitez effectuer plusieurs opérations, vous devez introduire des instructions conditionnelles dans votre code, ce qui peut rapidement devenir compliqué.
Méthode 3 : Utilisation du décorateur de distribution multiple
Le décorateur de répartition multiple est une bibliothèque Python qui vous permet de définir plusieurs implémentations ou instances d’une même fonction, en fonction du type de ses arguments. Cela signifie que vous pouvez définir la même fonction avec différents types de données et modifier entièrement son comportement.
Pour utiliser le décorateur de répartition multiple, procédez comme suit :
- Installez multipledispath dans votre environnement Python :
- Décorez votre (vos) fonction(s) avec l’élément @dispatch décorateur. Le décorateur @dispatch est un décorateur Python qui vous permet d’implémenter une distribution multiple. Il distribue automatiquement la fonction appropriée en fonction des arguments que vous lui passez. Vous pouvez utiliser le décorateur @dispatch en suivant ce modèle :
Voici un exemple qui utilise le décorateur de distribution multiple pour la surcharge de fonctions en Python :
L’extrait de code ci-dessus définit deux instances de la fonction add() . La première instance prend deux entiers comme arguments et renvoie leur somme.
La deuxième version de cette fonction prend en compte un entier et une liste. Elle ajoute l’entier à la liste et renvoie la nouvelle liste.
Cette approche de la surcharge de fonction en Python vous offre une grande flexibilité, en particulier si vous avez besoin de modifier le comportement de votre méthode. Pour en savoir plus, consultez la page documentation sur la distribution multiple.
La meilleure approche de la surcharge de fonctions en Python
L’approche que vous adoptez pour la surcharge de fonction devrait dépendre de ce que vous essayez de réaliser. Si vous pouvez accomplir votre tâche en utilisant des arguments par défaut ou des arguments variables, alors le décorateur de distribution multiple peut être exagéré. Cependant, le décorateur de distribution multiple est généralement la meilleure option pour son efficacité et sa précision.
Ce décorateur fournit un moyen propre et flexible d’implémenter la surcharge de fonction en Python. Il vous permet de définir plusieurs implémentations d’une même fonction en fonction du type de ses arguments.
Avec cette approche, vous pouvez créer des fonctions flexibles qui peuvent accepter différents types de paramètres sans avoir besoin d’instructions conditionnelles complexes.