From 4e299838003943793d59b50115fed70074bad54c Mon Sep 17 00:00:00 2001 From: gwen Date: Tue, 18 Apr 2017 21:53:35 +0200 Subject: [PATCH] algorithme vague --- algorithmique/cours/algo.txt | 2 +- algorithmique/cours/fonctions.txt | 42 +++++++++++++++++++---- algorithmique/cours/modularite.txt | 54 ++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 7 deletions(-) diff --git a/algorithmique/cours/algo.txt b/algorithmique/cours/algo.txt index 1e6b9cf..bc1aeb9 100644 --- a/algorithmique/cours/algo.txt +++ b/algorithmique/cours/algo.txt @@ -141,7 +141,7 @@ En voici une autre implémentation (en OCaml) : .. literalinclude:: code/factorielle.ml :language: ocaml -On remarque que le **pseudocode** (l'algorithme vague) est très proche de +On remarque que le **pseudocode** est très proche de la syntaxe du python : .. function:: factorielle(n:int) diff --git a/algorithmique/cours/fonctions.txt b/algorithmique/cours/fonctions.txt index a637574..dd54e4f 100644 --- a/algorithmique/cours/fonctions.txt +++ b/algorithmique/cours/fonctions.txt @@ -199,9 +199,14 @@ Portée locale dans une expression # a ;; Error: Unbound value a +.. important:: + + L’ordre d’évaluation dans un let ... in ... est bien déterminé, + sans grande importance dans un cadre purement fonctionnel, mais important + en cas d’effets de bord -Exemple de variable globale modifiée localement (** attention, mauvaise pratique ** !) : +Exemple de variable globale modifiée localement (**attention, mauvaise pratique** !) : .. code-block:: python @@ -217,11 +222,6 @@ Exemple de variable globale modifiée localement (** attention, mauvaise pratiqu >>> -.. important:: - - L’ordre d’évaluation dans un let ... in ... est bien déterminé, - sans grande importance dans un cadre purement fonctionnel, mais important - en cas d’effets de bord niveau @@ -229,6 +229,36 @@ niveau de procédures sous lesquelles elle est déclarée. Le programme principal a le niveau 0. +.. code-block:: python + :linenos: + + def _get_config(name): + # return config value + if not isfile(CONFIG_FILE): + raise Exception("Fichier de configuration non existant") + from ConfigParser import ConfigParser + cfg = ConfigParser(allow_no_value=True) + cfg.read(CONFIG_FILE) + + if name == "SUBNETS": + return eval(cfg.get('eole', 'subnets')) # c'est une liste de tuple # FIXME + elif name == "LEASES_FILE": + DHCP_PATH = cfg.get('eole', 'container_path_dhcp') + return join('/', DHCP_PATH, 'var/lib/dhcp/dhcpd.leases') + def get_routes(*args, **kwargs): + """ + Send list of reserved IP + return list of tuple (id, machine name, IP, MAC Adress) + """ + cfg = creole_loader(load_extra=True, rw=False, owner=MODNAME, + mandatory_permissive=False) + return zip(cfg.dhcp.dhcp.id_dhcp.id_dhcp, cfg.dhcp.dhcp.id_dhcp.hostname, + cfg.dhcp.dhcp.id_dhcp.ip, cfg.dhcp.dhcp.id_dhcp.macaddress) + +On voit que l'objet `cfg` ligne 6 et 7 a le même nom que l'objet `cfg` ligne 19. +C'est autorisé et les espaces de nommages sont différents. + + Description d'une fonction ~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/algorithmique/cours/modularite.txt b/algorithmique/cours/modularite.txt index 1aa742d..9891893 100644 --- a/algorithmique/cours/modularite.txt +++ b/algorithmique/cours/modularite.txt @@ -227,3 +227,57 @@ c'est-à-dire des phrases en langage naturel. jour + 1 et ainsi de suite jusqu'à ce que toutes les phrases soient calculables. + +Algorithme vague +-------------------- + +L'algorithme vague, c'est quand on pense l'algorithme en se plaçant du côté de +l'implémentation en premier. On a le nez dans le guidon, la vue d'ensemble est +difficile. + +Voici, tiré du monde réel, un exemple d'algorithme vague +("ce que doit faire une fonction"), placé dans un bout de code +(souvent la **docstring** d'une fonction). + +.. code-block:: python + + def upsert_route(*args, **kwargs): + """ + Create or modify an existant DHCP route + param tuple (id or null, machine name, IP, MAC Adress) + return True or False with error message + """ + # si id présent alors modification sinon ajout + # récupère la liste des réservations en cours + # y cherche la variable sur la base de l'ID + # modifie les valeurs + # applique la nouvelle conf DHCP + + return True + +Voici un autre bout de code avec l'algorithme en commentaire, +et l'implémentation effective de l'algorithme + +.. code-block:: python + + def del_route(*args, **kwargs): + """ + Delete an existant DHCP route + param tuple (id, machine name, IP, MAC Adress) + return True or False with error message + """ + # récupère la liste des réservations en cours + # y cherche la variable sur l'id donné en paramètre + # supprime l'entrée avec vérification que les données fournies + # sont bien dans l'enregistrement à supprimer + # applique la nouvelle conf DHCP + route_to_del = (1, "host2","10.1.2.4","6E:FF:56:A2:AF:17") # FIXME + routes = get_routes() + if route_to_del in routes: + c = creole_loader(load_extra=True, rw=True, owner=MODNAME, mandatory_permissive=False) + c_id = c.dhcp.dhcp.id_dhcp.id_dhcp.index(route_to_del[0]) + if c.dhcp.dhcp.id_dhcp.macaddress[c_id]==route_to_del[2] and c.dhcp.dhcp.id_dhcp.ip[c_id]==route_to_del[1]: + c.dhcp.dhcp.id_dhcp.id_dhcp.pop(c_id) + config_save_values(c, MODNAME) + return True + return False