62 votes

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 fonction de surcharge est absent en Python.

Aussi loin que je ressens un gros handicap car il est aussi un langage OO. Au départ, j'ai constaté que les incapables de faire la différence entre les types d'argument a été difficile, mais la nature dynamique de Python, il est facile (par exemple, liste, tuples, chaînes sont beaucoup semblable).

Toutefois compter le nombre d'arguments passés et en faisant le travail est comme un overkill.

36voto

vartec Points 53382

Maintenant, sauf si vous essayez d'écrire du code C++ à l'aide de la syntaxe de Python, de quoi avez vous besoin de surcharger?

Je pense que c'est exactement à l'opposé, la surcharge est du hack de travail pour les handicapés langues, qui ont besoin de typage statique des arguments de la fonction et le nombre exact d'entre eux. En Python, vous avez argument mot-clé, vous avez *args et **kwargs.

Voir, par exemple: http://stackoverflow.com/questions/682504/what-is-a-clean-pythonic-way-to-have-multiple-constructors-in-python

33voto

Ryan Ginstrom Points 8354

Comme détendez-vous noté, mot-clé arguments avec des valeurs par défaut peut aller un long chemin.

Je vais aussi de l'état qui, à mon avis, il va à l'encontre de l'esprit de Python à s'inquiéter de ce que les types sont passés dans les méthodes. En Python, je pense que c'est plus accepté duck-typing-demander ce qu'un objet peut faire, plutôt que ce que c'est.

Ainsi, si votre méthode peut accepter une chaîne ou un n-uplet, vous pourriez 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 faire l'une de ces:

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

Bien qu'une API comme qui indique parfois un problème de conception.

22voto

Stefano Borini Points 36904

vous n'avez pas besoin de surcharge de fonctions, comme vous avez l' *args et **kwargs arguments.

Le fait est que la fonction de surcharge est basé sur l'idée que la transmission de différents types, vous exécutez un code différent. Si vous avez un typées dynamiquement langage comme python, vous ne devriez pas faire la distinction par type, mais vous devez traiter avec des interfaces et de leur conformité avec le code que vous écrivez.

Par exemple, si vous disposez d'un code qui peut gérer soit un entier ou une liste d'entiers, vous pouvez essayer de l'itération et si vous ne pouvez pas, alors vous supposez que c'est un entier et aller de l'avant. Bien sûr, il pourrait être un float, mais aussi loin que le comportement est en cause, si un float et int semblent être les mêmes, alors ils peuvent être interchangés.

6voto

unwind Points 181987

Souvent, la suggestion utilise des arguments de mot-clé, avec des valeurs par défaut. Regardez dans cela.

6voto

Lakshman Prasad Points 24002

Vous pouvez passer un type de données de conteneur modifiable 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 vous avez besoin d'une même interface, écrivez simplement une fonction d'interface (ou une méthode) 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'ajuster à ce problème venant de Java, mais ce n'est vraiment pas un "gros handicap"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X