382 votes

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 par le biais de h sont des chaînes de caractères qui ont chacune une signification différente. Il est important que je puisse choisir les paramètres facultatifs à passer 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 ces éléments (ce sont mes choix).

Ce serait génial si je pouvais surcharger la fonction, mais j'ai lu que Python ne prend pas en charge 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.

Pour l'instant, j'envoie des chaînes vides à la place des quelques premiers arguments manquants comme caractères de remplacement. J'aimerais pouvoir appeler une fonction en utilisant uniquement les valeurs réelles.

Y a-t-il un moyen de faire cela ? Pourrais-je passer une liste au lieu de la liste d'arguments ?

Actuellement, le prototype utilisant ctypes ressemble à quelque chose comme :

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

4 votes

Re W

410voto

Nix Points 22944

Il suffit d'utiliser le *args qui vous permet de passer autant d'arguments que vous le souhaitez après le paramètre a,b,c . Il faudrait ajouter une certaine logique à la carte args -> c,d,e,f mais c'est une "façon" de surcharger.

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

Et il imprimera les valeurs de c,d,e,f


De la même manière, vous pouvez utiliser l'option kwargs et vous pouvez ensuite 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 puis kwargs aurait un dictionnaire de tous les paramètres qui ont une valeur de clé après a,b

2 votes

T

20 votes

I A

0 votes

Si vous êtes préoccupé par la complexité du temps. Il s'agit d'un problème

296voto

Russell Borogove Points 8423

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

69voto

PYC Points 161

C'est très facile, il suffit de faire ceci

def foo(a = None):
       print(a)

Au lieu de None, vous pouvez saisir tout ce qui devrait être à la place s'il n'y avait pas d'argument ; par exemple, si vous n'écrivez pas la valeur du paramètre comme ceci foo() alors il imprimera None car aucun argument n'est donné et si vous lui DONNEZ un argument comme foo("hello world") alors il imprimera hello world

20voto

Avión Points 3688

Les paramètres obligatoires sont placés en premier, les paramètres facultatifs en second. Les paramètres optionnels sont toujours accompagnés d'un =None .

Exemple simple et rapide :

def example_function(param1, param2, param3=None, param4=None):
    pass

# Doesn't work, param2 missing
example_function("hello")

# Works
example_function("hello", "bye")

# Works. Both the same
example_function("hello", "bye", "hey")
example_function("hello", "bye", param3="hey")

# Works. Both the same
example_function("hello", "bye", "hey", "foo")
example_function("hello", "bye", param3="hey", param4="foo")

9voto

cem Points 1100

De manière plus appropriée :

from typing import Optional

def foo(a: str, b: Optional[str]) -> str or None:
    pass

qui est un événement équivalent à :

def foo(a: str, b: str or None = None) -> str or None
    pass

Pour plus d'informations : https://docs.python.org/3/library/typing.html#typing.Optional

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