Skip to content

10. Exercice d’application : version 2

Image

Cette nouvelle version introduit le fichier [config.py] suivant :


def configure():
    import os

    # chemin absolu du dossier de ce script
    script_dir = os.path.dirname(os.path.abspath(__file__))

    # racine à partir de laquelle vont être mesurés certains chemins relatifs
    root_dir = "C:/Data/st-2020/dev/python/cours-2020/python3-flask-2020/impots"

    # dépendances de l'application
    absolute_dependencies = [
        f"{root_dir}/v01/shared",
    ]

    # configuration de l'application
    config = {
        # chemin absolu du fichier des contribuables
        "taxpayersFilename"f"{script_dir}/../data/taxpayersdata.txt",
        # chemins absolu du fichier des résultats
        "resultsFilename"f"{script_dir}/../data/résultats.txt"
    }

    # mise à jour du syspath
    from myutils import set_syspath
    set_syspath(absolute_dependencies)

    # on rend la config
    return config

Commentaires

  • ligne 5 : on récupère le nom absolu du dossier qui contient le script qui s’exécute, ici le script [config.py]. On obtient donc le nom absolu du dossier [main]. C’est également ce dossier qui contient le script principal [main.py] ;
  • ligne 8 : lorsqu’un fichier référencé n’appartient pas au dossier de l’application, on n’utilisera pas [script_dir] pour le localiser mais [root_dir]. Cette ligne devra être changée dès que l’application change de place dans le système de fichiers ;
  • lignes 11-13 : on liste les noms absolus de tous les dossiers qui doivent se trouver dans le Python Path pour que l’application fonctionne. Ligne 12, on référence le dossier [shared] de la version 1 de l’exercice d’application ;
  • lignes 16-21 : définissent la configuration de l’application dans un dictionnaire [config]. Ici on inscrit les chemins absolus des fichiers texte manipulés par l’application. Pour cela, on utilise [script_dir] qui rappelons-le, désigne ici le dossier [main] ;
  • lignes 24-25 : on fixe le Python Path nécessaire à l’application ;

Le script principal [main.py] est le suivant :


# on configure l'application
import config

config = config.configure()

# le syspath est configuré - on peut faire les imports
from impôts_module_01 import calcul_impôt, record_results, get_taxpayers_data

# fichier des contribuables
taxpayers_filename = config['taxpayersFilename']
# fichier des résultats
results_filename = config['resultsFilename']

# code
try:

    # lecture des données contribuables
    taxpayers = get_taxpayers_data(taxpayers_filename)
    # liste des résultats
    results = []
    # on calcule l'impôt des contribuables
    for taxpayer in taxpayers:
        # le calcul de l'impôt renvoie un dictionnaire de clés
        # ['marié', 'enfants', 'salaire', 'impôt', 'surcôte', 'décôte', 'réduction', 'taux']
        result = calcul_impôt(taxpayer['marié'], taxpayer['enfants'], taxpayer['salaire'])
        # le dictionnaire est ajouté à la liste des résultats
        results.append(result)
    # on enregistre les résultats
    record_results(results_filename, results)
except BaseException as erreur:
    # il peut y avoir différentes erreurs : absence de fichier, contenu de fichier incorrect
    # on affiche l'erreur et on quitte l'application
    print(f"L'erreur suivante s'est produite : {erreur}]\n")
finally:
    print("Travail terminé...")

Commentaires

  • lignes 1-4 : l’application est configurée ;
  • ligne 7 : on sait qu’après la configuration, le Python Path est correct et contient notamment le dossier [shared] qui contient le script [impôts_module_01]. De ce script, on importe les fonctions dont on a besoin ;
  • lignes 9-12 : les noms des fichiers utilisés sont trouvés dans la configuration. Ce sont des noms absolus ;
  • lignes 14-35 : on retrouve le code de la version 1 ;

La version 1 ne marchait pas dans une console Python. Dans cette même console, la version 2 donne les résultats suivants :

(venv) C:\Data\st-2020\dev\python\cours-2020\python3-flask-2020\impots\v02>python main/main.py
Travail terminé...

Aucune erreur n’est désormais rencontrée.