ATTENTION : page provisoire: les liens ne fonctionnent pas.
On voit fréquemment les kwargs lors de l’appel d’une fonction ou d’une méthode de classe. C’est qu’il y a quelques avantages, mais aussi quelques inconvénients.
L’avantage principal est que l’écriture du code est accélérée. Au lieu de devoir écrire une ribambelle de paramètres:
def f(a=1, b="nnn", x=45.63, etc.):
il suffit d’écrire:
def f(**kwargs):
parce qu’on accède ainsi quasi directement aux entrailles du code, ce qui oblige à quelques précautions. Soit une classe qui permet d’ajouter des attributs à la classe:
class Classe_exemple(object):
def __init__(self):
self.a = 0.0
self.b = 15.0
self.c = "rouge"
def addA(self, **kwargs):
for k in kwargs.keys():
self.__setattr__(k, kwargs[k])
En jouant avec ce code, on se rendra compte que à condition de faire correctement les appels de addA, la classe digère tout:
ex = Classe_exemple()
ex.addA(**{'a':45.0, 'b':None, "x":1000})
ex.addA(clong=135.0, glong="777", klong=(85, 12))
On voit qu’il y a (au moins) deux écritures correctes pour appeler addA:
Si l’attribut x est déjà dans la classe, il prend la nouvelle valeur.
Sinon, il est simplement ajouté à la classe. Et dans certains cela peut être dangereux; par exemple, quand on a voulu changer la valeur d’un attribut et qu’en fait, parce qu’on s’est trompé sur l’orthographe exacte, on a ajouté un nouvel attribut. C’est pourquoi j’utilise deux méthodes, l’une pour en ajouter un attribut (voir ci-desus addA); et une autre pour la mise à jour d’un attribut existant:
def setA(self, **kwargs):
" pour changer la valeur d'un attribut "
for k in kwargs.keys():
if str(k) in self.__dict__.keys():
self.__setattr__(k, kwargs[k])
else:
print("Base:", k, "= attribut inconnu")
1. On voit qu’il est inutile de tenir à jour manuellement une liste de paramètres autorisés (comme on le voit dans certains exemples sur Stackoverflow): Python peut regarder son nombril:
if str(k) in self.__dict__.keys():
2. Il est inutile de chercher à circonvenir l’interpréteur Python, avec quelques ruses comme celle-ci:
try:
ex.addA("kc"=5.0, "kd"="7777", "ky"=(8, 13))
except SyntaxError:
print("SyntaxError: keyword can't be an expression")
il n’y a pas de parachute en cas de SyntaxError!