171 votes

Pourquoi les arguments non par défaut ne peuvent-ils pas suivre les arguments par défaut ?

Pourquoi ce morceau de code génère-t-il une SyntaxError ?

>>> def fun1(a="who is you", b="True", x, y):
...     print a,b,x,y
... 
  File "<stdin>", line 1
SyntaxError: non-default argument follows default argument

Alors que le morceau de code suivant s'exécute sans erreur visible :

>>> def fun1(x, y, a="who is you", b="True"):
...     print a,b,x,y
...

207voto

Rahul Gautam Points 1564

Tous les paramètres requis doivent être placés avant tout argument par défaut. Tout simplement parce qu'ils sont obligatoires, alors que les arguments par défaut ne le sont pas. Syntaxiquement, ce serait impossible pour que l'interpréteur décide quelles valeurs correspondent à quels arguments si les modes mixtes étaient autorisés. A SyntaxError est soulevé si les arguments ne sont pas donnés dans le bon ordre :

Examinons les arguments des mots-clés, en utilisant votre fonction.

def fun1(a="who is you", b="True", x, y):
...     print a,b,x,y

Supposons qu'il soit permis de déclarer la fonction comme ci-dessus, Ensuite, avec les déclarations ci-dessus, nous pouvons faire les appels d'arguments positionnels ou de mots-clés suivants (réguliers) :

func1("ok a", "ok b", 1)  # Is 1 assigned to x or ?
func1(1)                  # Is 1 assigned to a or ?
func1(1, 2)               # ?

Comment vous allez suggérer l'affectation des variables dans l'appel de fonction, comment les arguments par défaut vont être utilisés avec les arguments par mot-clé.

>>> def fun1(x, y, a="who is you", b="True"):
...     print a,b,x,y
... 

Référence O'Reilly - Core-Python
Alors que cette fonction utilise les arguments par défaut syntaxiquement corrects pour les appels de fonction ci-dessus. L'appel d'arguments par mot-clé s'avère utile pour pouvoir fournir des arguments positionnels non ordonnés, mais, couplés aux arguments par défaut, ils peuvent également être utilisés pour "sauter" les arguments manquants.

21voto

jamylak Points 38094
SyntaxError: non-default argument follows default argument

Si vous autorisiez cela, les arguments par défaut seraient rendus inutiles parce que vous ne pourriez jamais utiliser leurs valeurs par défaut, puisque les arguments non par défaut viennent après .

En Python 3 cependant, vous pouvez faire ce qui suit :

def fun1(a="who is you", b="True", *, x, y):
    pass

qui fait x y y mot-clé seulement pour que vous puissiez faire ça :

fun1(x=2, y=2)

Cela fonctionne car il n'y a plus d'ambiguïté. Notez que vous ne pouvez toujours pas faire fun1(2, 2) (ce qui définirait les arguments par défaut).

16voto

Ayodhyankit Paul Points 4505

Permettez-moi de clarifier deux points ici :

  • Tout d'abord, l'argument non par défaut ne doit pas suivre l'argument par défaut, ce qui signifie que vous ne pouvez pas définir (a=b,c) dans une fonction. L'ordre de définition des paramètres dans une fonction est le suivant :
    • paramètre positionnel ou paramètre hors défaut, c'est-à-dire (a,b,c)
    • paramètre de mot-clé ou paramètre par défaut, c'est-à-dire (a="b",r="j")
    • paramètre à mot-clé seul, c'est-à-dire (*args)
    • var-mot-clé paramètre c.-à-d. (**kwargs)

def example(a, b, c=None, r="w" , d=[], *ae, **ab):

(a,b) sont des paramètres positionnels

(c=none) est un paramètre optionnel

(r="w") est le paramètre du mot-clé

(d=[]) est un paramètre de liste

(*ae) est un mot-clé seulement

(**ab) est le paramètre var-mot-clé

  • Maintenant, le problème secondaire est que si j'essaie quelque chose comme ça.. : def example(a, b, c=a,d=b):

n'est pas défini lorsque les valeurs par défaut sont sauvegardées, Python calcule et enregistre les valeurs par défaut lorsque vous définissez la fonction

c et d ne sont pas définis, n'existe pas, lorsque cela se produit (il n'existe que lorsque la fonction est exécutée)

"a,a=b" n'est pas autorisé dans le paramètre.

1voto

cforbish Points 3171

Les arguments obligatoires (ceux qui n'ont pas de valeur par défaut), doivent être au début pour permettre au code client de n'en fournir que deux. Si les arguments facultatifs étaient au début, cela prêterait à confusion :

fun1("who is who", 3, "jack")

Qu'est-ce que cela ferait dans votre premier exemple ? Dans le dernier, x est "qui est qui", y est 3 et a = "jack".

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