Mise à jour vers Python 3.8

Lorsque la seconde version du simulateur a été conçue, les constructeurs de classes ont tous été conçus de la même manière, c'est-à-dire acceptant dans cet ordre :

  • l'environnement SimPy en argument positionnel sans valeur par défaut (et donc requis)
  • un identifiant en argument positionnel sans valeur par défaut (et donc requis)
  • un certain nombre d'arguments positionnels sans valeur par défaut, généralement déduits et calculés lors du chargement du réseau
  • un certain nombre d'arguments nommés avec None comme valeur par défaut, considérés optionnels et extraits du JSON original fourni en paramètre
  • **kwargs, le reste des champs du JSON original fourni en paramètre qui ne sont pas gérés directement par le constructeur

L'idée était la suivante : les paramètres positionnels sont uniquement et systématiquement fournis par le simulateur tandis que les paramètres nommés proviennent uniquement et optionnellement du fichier JSON, autrement dit de l'utilisateur.

Malheureusement cette restriction est purement conceptuelle et rien n'empêche de ne pas la vérifier, en particulier :

  1. un paramètre formel positionnel peut être fourni dans le JSON en tant que paramètre effectif nommé
  2. un paramètre formel nommé, normalement prévu pour être inclus uniquement dans le JSON, peut être fourni en tant que paramètre effectif positionnel
  3. deux paramètres de même noms peuvent être fournis en même temps : en tant que paramètre effectif positionnel et dans le JSON, occasionnant alors un plantage de la simulation, par exemple : __init__() got multiple values for argument 'id'

La solution au troisième point a été de supprimer du JSON le champ en double avant l'appel du constructeur, même si cela a également montré ses limites rapidement : il faut faire cette suppression au niveau de tous les sites d'appel du constructeur et veiller à bien couvrir tous les noms correspondant à un argument positionnel.

Aucune solution n'avait été proposée pour les deux premiers points. Cependant depuis Python 3.8, les positional-only parameters ont été introduits (avec la syntaxe , /, ), en plus des keyword-only parameters déjà disponibles (avec la syntaxe , *, ), ce qui permet de déclarer que les paramètres ne peuvent être fournis que d'une seule manière et de le vérifier en introduisant une restriction syntaxique.

En migrant vers Python 3.8, il deviendra possible d'expliciter cette convention, jusqu'à présent non documentée, via la nouvelle syntaxe et d'empêcher systématiquement les cas 1 et 2 de se produire.

Modification effectuée par Vincent Bombardier