web-dev-qa-db-fra.com

Surcharge de fonction en Python: manquant

Comme cela dit:

http://web.archive.org/web/20090624083829/http://mail.python.org/pipermail/python-list/2003-May/206149.html

La surcharge de fonctions est absente en Python.

Pour moi, c'est un gros handicap car c'est aussi un langage OO. Au début, j'ai trouvé qu'il était difficile de faire la différence entre les types d'arguments, mais la nature dynamique de Python simplifié (par exemple, la liste, les tuples, les chaînes sont très similaires).

Cependant, compter le nombre d'arguments passés puis faire le travail est comme une surpuissance.

61
Xolve

Comme indiqué, les arguments de mots clés avec des valeurs par défaut peuvent aller très loin.

Je dirai également qu'à mon avis, cela va à l'encontre de l'esprit de Python pour s'inquiéter beaucoup des types qui sont passés dans les méthodes. En Python, je pense qu'il est plus accepté d'utiliser le typage canard - demander ce qu'un objet peut faire, plutôt que ce qu'il est.

Ainsi, si votre méthode peut accepter une chaîne ou un tuple, vous pouvez faire quelque chose comme ceci:

def print_names(names):
    """Takes a space-delimited string or an iterable"""
    try:
        for name in names.split(): # string case
            print name
    except AttributeError:
        for name in names:
            print name

Ensuite, vous pouvez effectuer l'une des opérations suivantes:

print_names("Ryan Billy")
print_names(("Ryan", "Billy"))

Bien qu'une API comme celle-ci indique parfois un problème de conception.

33
Ryan Ginstrom

Maintenant, sauf si vous essayez d'écrire du code C++ à l'aide de la syntaxe Python, pourquoi auriez-vous besoin d'une surcharge?

Je pense que c'est exactement l'opposé, la surcharge n'est nécessaire que pour que les langages fortement typés agissent davantage comme Python. Dans Python vous avez un argument mot-clé, vous avez *args et **kwargs.

Voir par exemple: Qu'est-ce qu'une manière propre et Pythonique d'avoir plusieurs constructeurs en Python?

36
vartec

vous n'avez pas besoin de surcharge de fonction, car vous avez les arguments * args et ** kwargs.

Le fait est que la surcharge de fonctions est basée sur l'idée qu'en passant différents types, vous exécuterez un code différent. Si vous avez un langage typé dynamiquement comme python, vous ne devez pas faire de distinction par type, mais vous devez gérer les interfaces et leur conformité avec le code que vous écrivez.

Par exemple, si vous avez du code qui peut gérer soit un entier, soit une liste d'entiers, vous pouvez essayer d'itérer dessus et si vous ne le pouvez pas, alors vous supposez que c'est un entier et allez de l'avant. Bien sûr, cela pourrait être un flottant, mais en ce qui concerne le comportement, si un flotteur et un int semblent être identiques, ils peuvent être échangés.

22
Stefano Borini

Souvent, la suggestion utilise à la place des arguments de mot clé, avec des valeurs par défaut. Regardez ça.

6
unwind

Vous pouvez passer un type de données de conteneur mutable dans une fonction, il peut contenir tout ce que vous voulez.

Si vous avez besoin d'une fonctionnalité différente, nommez les fonctions différemment, ou si U a besoin d'une même interface, écrivez simplement une fonction (ou méthode) d'interface qui appelle les fonctions de manière appropriée en fonction des données reçues.

Il m'a fallu un certain temps pour m'adapter à cela venant de Java, mais ce n'est vraiment pas un "gros handicap"

6
Lakshman Prasad