web-dev-qa-db-fra.com

Comment créer une fonction Python avec des arguments facultatifs?

J'ai une fonction Python qui prend plusieurs arguments. Certains de ces arguments peuvent être omis dans certains scénarios.

def some_function (self, a, b, c, d = None, e = None, f = None, g = None, h = None):
    #code

Les arguments d à h sont des chaînes ayant chacune une signification différente. Il est important que je puisse choisir quels paramètres facultatifs transmettre dans n'importe quelle combinaison. Par exemple, (a, b, C, d, e), ou (a, b, C, g, h), ou (a, b, C, d, e, f, ou tous (c’est mon choix).

Ce serait formidable si je pouvais surcharger la fonction - mais j’ai lu que Python ne supporte pas la surcharge. J'ai essayé d'insérer certains des arguments int requis dans la liste - et j'ai obtenu une erreur de non-concordance des arguments.

En ce moment, j'envoie des chaînes vides à la place des premiers arguments manquants en tant qu'espaces réservés. J'aimerais pouvoir appeler une fonction en utilisant simplement les valeurs réelles.

Est-ce qu'il y a un moyen de faire ça? Puis-je passer une liste à la place de la liste d'arguments?

Actuellement, le prototype utilisant ctypes ressemble à ceci:

_fdll.some_function.argtypes = [c_void_p, c_char_p, c_int, c_char_p, c_char_p, c_char_p, c_char_p, c_char_p]
140
Thalia

Essayez de l'appeler comme suit: obj.some_function( '1', 2, '3', g="foo", h="bar" ). Après les arguments de position requis, vous pouvez spécifier des arguments facultatifs spécifiques par nom.

135
Russell Borogove

Utilisez simplement le paramètre * args, qui vous permet de transmettre autant d’arguments que vous le souhaitez après votre a,b,c. Il faudrait ajouter une certaine logique pour mapper args-> c, d, e, f mais c’est un "moyen" de surcharger.

def myfunc(a,b, *args, **kwargs):
   for ar in args:
      print ar
myfunc(a,b,c,d,e,f)

Et ça va imprimer c,d,e,f


De même, vous pouvez utiliser l'argument kwargs puis nommer vos paramètres.

def myfunc(a,b, *args, **kwargs):
      c = kwargs.get('c', None)
      d = kwargs.get('d', None)
      #etc
myfunc(a,b, c='nick', d='dog', ...)

Et alors, kwargs aurait un dictionnaire de tous les paramètres qui ont une valeur de clé après a,b

168
Nix