J'ai besoin de faire quelque chose comme ça :
def func1(a, *args, b="BBB", **kwargs):
print "a=%s b=%s args=%s kwargs=%s" % (a, b, args, kwargs)
Donc ça appelle comme ça :
func1("AAAA", h="HHH", j="JJJ")
Produit la sortie :
a=AAAA b=BBB args=() kwargs={'h': 'HHH', 'j': 'JJJ'}
Mais il n'est pas possible de mettre un argument nommé par défaut après *args
. ( SyntaxError: invalid syntax
)
- Pourquoi cela n'est-il pas autorisé ?
- Existe-t-il un moyen lisible de mettre en œuvre ce système ? Le seul moyen que je connaisse est
b=kwargs.pop("b", "BBB")
mais ce n'est pas très lisible. Je préférerais que ce soit dans la définition de l'appel de fonction, là où il faut : c'est un paramètre qui va toujours ont une valeur, soit une valeur par défaut, soit une valeur donnée par l'utilisateur.
EDITAR
Je pourrais mettre b
devant args
:
def func1(a, b="BBB", *args, **kwargs):
print "a=%s b=%s args=%s kwargs=%s" % (a, b, args, kwargs)
Mais cela voudrait dire que cet appel :
func1("AAAA", "CCC", h="HHH", j="JJJ")
Assigne "CCC"
à b
ce que je ne veux pas. Je veux b
pour être une arg nommée, et non pas une arg possitionnelle.