Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

fonction qui se comporte differement selon nombre ou type d'arguments

+2 votes

quelle est la façon la plus pythonique pour qu'une fonction se comporte différemment selon le nombre et le type d' arguments.

C'est une question générale que je me pose en étudiant Django au sujet des vues.

demandé 5-Aou-2016 par buffalo974 (2,476 points)

2 Réponses

+7 votes
 
Meilleure réponse

Chez S&M, l'article approprié concerne l'opérateur "splat" de Python, qui permet de passer une liste d'arguments nommés ou positionnés.
http://sametmax.com/operateur-splat-ou-etoile-en-python/

def ma_fonction(*args, **kwargs):
    for i, arg in enumerate(args):
        print("position", i, "=", arg, type(arg))
    for key, kwarg in kwargs.items():
        print(key, "=", kwarg, type(kwarg))

*args : permet de dire à la fonction qu'elle peut prendre une infinité d'arguments positionnés, args sera une liste de valeurs, ex: ma_fonction(1, 2, "toto", 5.5)
**kwargs : permet de dire à la fonction qu'elle peut prendre une infinité d'arguments nommés, kwargs sera un dictionnaire, ex: ma_fonction(valeur=1, titi="toto", pwet=12.7)

Bien sûr on ne peut pas faire n'importe quoi, genre placer des arguments nommés en plein milieu d'arguments positionnés, ex: ma_fonction(1, toto=2, "titi").

Bon courage !

répondu 5-Aou-2016 par debnet (962 points)
sélectionné 6-Aou-2016 par buffalo974
+1 vote

Réponse se basant uniquement sur Python, je ne connais pas Django.
Niveau nombre d'arguments, le plus simple à mon avis est d'utiliser des valeurs par défaut. Ainsi tu peux avoir un comportement "global" lorsque tu ne donnes que le strict minimum, et plusieurs niveaux de précision en fonction des arguments optionnel que tu passes.
Pour ce qui est du type de tes arguments, là c'est plus épineux (et personnel).

Si la question est: "puis-je passer un argument avec différents types à une fonction unique?" la réponse est "oui, mais". Parce que ça ouvre la porte à tout un tas de complications et de pré-traitements, et que de base tu ne devrais pas avoir à le faire (méthode KISS: keep it simple, stupid).

Si la question est: "puis-je avoir des traitements différents en fonction du type de mon argument (quitte à ce que j'écrive plusieurs fonctions)?" la réponse est "oui, même si Python ne permet pas une surcharge telle qu'on peut en faire en C++". Regarde du côté de l'héritage, de la surcharge de fonctions.
un exemple tout cuit
chez Sam et Max

répondu 5-Aou-2016 par furankun (1,398 points)
...