Pourquoi ce morceau de code lève-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 erreurs visibles:
>>> def fun1(x, y, a="who is you", b="True"):
... print a,b,x,y
...
def myfunction(position_arguments, *arguments, **keywords):
`....`Réponses:
Tous les paramètres requis doivent être placés avant les arguments par défaut. Simplement parce qu'ils sont obligatoires, alors que les arguments par défaut ne le sont pas. D'un point de vue syntaxique, il serait impossible pour l'interpréteur de décider quelles valeurs correspondent à quels arguments si les modes mixtes étaient autorisés. A
SyntaxError
est levé si les arguments ne sont pas donnés dans le bon ordre:Jetons un coup d'œil aux arguments de mots clés, en utilisant votre fonction.
Supposons qu'il soit autorisé à déclarer la fonction comme ci-dessus, puis avec les déclarations ci-dessus, nous pouvons faire les appels d'argument positionnel ou mot-clé suivants (réguliers):
Comment vous suggérerez l'affectation de variables dans l'appel de fonction, comment les arguments par défaut seront utilisés avec les arguments de mots-clés.
Référence O'Reilly - Core-Python
Où que cette fonction utilise les arguments par défaut syntaxiquement corrects pour les appels de fonction ci-dessus. L'appel d'arguments de mots-clés s'avère utile pour pouvoir fournir des arguments de position dans le désordre, mais, couplés aux arguments par défaut, ils peuvent également être utilisés pour "ignorer" les arguments manquants.
la source
func1(x=1, y=2)
.**kwargs
ne pouvais pas fairedef fun1(a="who is you", b="True", x, y)
un travail similaire. Si vous utilisezdef f(**kwargs)
, vous devez gérer les valeurs par défaut dans le corps?def fun1(a="who is you", b="True", x, y)
la même chose soit réalisée avec un style différent. if def fun1 (** kwrgs) `alors appelerfun1({'a': 'who is you', 'b': True})
pas besoin de passer x et y.def foo(x=None, y)
était autorisé. Je suis donc toujours curieux de savoir pourquoi cela n'est pas autorisé par Python. Y a-t-il une vraie raison fondamentale ou est-ce simplement "nous ne le permettons pas parce que nous ne le permettons pas".Si vous autorisiez cela, les arguments par défaut seraient rendus inutiles car vous ne pourrez jamais utiliser leurs valeurs par défaut, puisque les arguments non par défaut viennent après .
Cependant, dans Python 3, vous pouvez effectuer les opérations suivantes:
qui fait
x
ety
mot - clé uniquement pour que vous puissiez le faire:Cela fonctionne car il n'y a plus d'ambiguïté. Notez que vous ne pouvez toujours pas faire
fun1(2, 2)
(cela définirait les arguments par défaut).la source
Permettez-moi de clarifier deux points ici:
def example(a, b, c=None, r="w" , d=[], *ae, **ab):
(a, b) sont des paramètres de position
(c = aucun) est un paramètre facultatif
(r = "w") est le paramètre de mot clé
(d = []) est le paramètre de liste
(* ae) est un mot clé uniquement
(** ab) est le paramètre var-keyword
def example(a, b, c=a,d=b):
L'argument n'est pas défini lorsque les valeurs par défaut sont enregistré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é en paramètre.
la source
Les arguments requis (ceux sans valeurs par défaut) doivent être au début pour permettre au code client de n'en fournir que deux. Si les arguments optionnels étaient au début, ce serait déroutant:
Qu'est-ce que cela ferait dans votre premier exemple? Dans le dernier, x est "qui est qui", y est 3 et a = "jack".
la source