Les kwargs

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:

  • l’une où le nom de l’attribut est donné sous forme de string;
  • l’autre où il est donné sous forme de nom de variable.

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")

Remarques

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!

Table des matières

Sujet précédent

Symboles et glyphes

Cette page