85 votes

Python, arguments de mot clé par défaut après les arguments de position de longueur variable

Je pensais que je pouvais utiliser des paramètres nommés après de longueur variable des paramètres positionnels dans un appel de fonction, mais je reçois une erreur de syntaxe lors de l'importation d'un python de classe, je suis en train d'écrire à la suite de la méthode "get", par exemple:

class Foo(object):
    def __init__(self):
        print "You have created a Foo."

    def get(self,*args,raw=False,vars=None):
        print len(args)
        print raw
        print vars

L'erreur ressemble à:

def get(self,*args,raw=False,vars=None):
                     ^
SyntaxError: invalid syntax

J'aimerais pouvoir appeler la méthode de plusieurs façons:

f = Foo()
f.get(arg1,arg2)
f.get(arg1,raw=True)
f.get(arg1,arg2,raw=True,vars=something)

...etc.

J'ai RTFM autant que je le peux, mais ce n'est pas tout sur pourquoi cela ne fonctionne pas. Merci d'avance pour votre aide.

-j

73voto

delnan Points 52260

Cela fonctionne, mais uniquement en Python 3. Voir PEP 3102 . En parcourant les documents "Quoi de neuf", il semble qu'il n'y ait pas de backport 2.x, vous n'avez donc pas de chance. Vous devrez accepter tous les arguments de mots clés ( **kwargs ) et les analyser manuellement (vous pouvez utiliser d.get(k, default) pour obtenir d[k] ou default si ce n'est pas là).

50voto

Imran Points 20117

Python syntaxe ne permet pas de variable args dans la fonction et les arguments mot-clé avec une valeur par défaut en même temps. Si vous devez avoir des arguments mot-clé le long avec un nombre arbitraire d'arguments de position, vous devez autoriser nombre arbitraire d'arguments mots-clefs.

C'est un modèle courant à fournir des valeurs par défaut pour le mot-clé arguments, ainsi qu'en permettant à un nombre quelconque d'arguments positionnels:

def foo(*args, **kwargs):
   raw = kwargs.pop('raw', False)
   vars = kwargs.pop('vars', None)

Si vous n'utilisez pas le mot-clé supplémentaire des arguments à tous, vous n'avez rien à craindre. Cela rend la fonction un peu moins de l'auto-documentation, que vous pouvez faire avec un écrit correctement docstring.

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