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]
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.
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