Outils de développement

Author

Ludovic Deneuville

Stack VM

  • Python 3.10 : la version de Python installée à l’ENSAI
  • Visual Studio Code : votre éditeur de code
  • Git : pour gérer vos dépôts
  • PostgreSQL : une base de données
    • DBeaver : pour consulter, modifier cette base de données

Visual Studio Code

  • Éditeur de code source populaire
  • Intégre un explorer et un terminal
  • Nombreuses extensions
  • Personnalisation avancée

Zoom sur les Settings

  • fichier .vscode/settings.json
  • Formater : Black
  • Linter : Flake8
  • Montrer le fichier settings.json (DEMO)
  • icone ⚙️ niveau workspace ou user
  • à priori vous n’avez rien à modifier
  • vous pouvez intégrer ce fichier dans votre dépôt projet
  • Formater et Linter en phase

Formater :

  • Ligne trop longue
  • Espaces superflux

Qualité du Code

Pourquoi la Qualité ?

  • Maintenabilité : plus facile à comprendre, à maintenir et à modifier
  • Lisibilité : facilite la collaboration et réduit les erreurs
  • Performance : fonctionne mieux et consomme moins de ressources
  • Sécurité : moins susceptible de contenir des vulnérabilités

Pylint

Outil d’analyse statique pour Python qui :

  • Vérifie la conformité du code aux normes de style
  • Détecte les erreurs potentielles
  • Identifie les mauvaises pratiques
Commandes
pylint src
pylint --output-format=colorized --disable=C0114,C0411,C0415,W0718 $(git ls-files '*.py') --fail-under=7.5
  • Vous pouvez disable les règles qui vous ennuient
  • À faire régulièrement

Aborescence du dépôt

PROJET-INFO-2A
    ├── .vscode
    │   └── settings.json
    ├── data
    │   └── init_db.sql
    ├── doc
    │   └── suivi
    │       └── YYYY.MM.DD-semaineN.md
    ├── src
    │   ├── business_object
    │   │   └── une_classe.py
    │   ├── dao
    │   │   └── une_classe_dao.py
    │   ├── service
    │   │   └── une_classe_service.py
    │   ├── tests
    │   │   ├── dao
    │   │   └── service
    │   ├── utils
    │   └── view
    │       └── accueil_view.py
    ├── .gitignore
    ├── LICENCE
    ├── README.md
    └── requirements.txt

Documentation

operations_mathematiques.py
class OperationsMathematiques:
    """Opérations Mathématiques"""
    def diviser_cinq_par(self, nombre) -> float:
        """Divise le nombre 5 par un nombre donné.
        Parameters
        ----------
        nombre : float or int
            Le nombre par lequel 5 sera divisé.
        Returns
        -------
        float or None
            Le résultat de la division de 5 par le nombre donné.
            Si le nombre est égal à 0, la méthode retourne None.
        """
        if nombre != 0:
            return 5 / nombre
        else:
            return None
  • Doc classes
    • Attributs
  • Doc méthodes
    • brève description
    • paramètres
    • retour

Logs

Qu’est-ce que les logs

Note

La journalisation (ou logging) est le processus d’enregistrement des événements, des erreurs, et des informations dans une application.

Un log capture des informations sur ce qui s’est passé à un moment donné :

  • Surveillance
  • Débogage
  • Ils permettent de surveiller l’état d’un système, des comportements inattendus
  • Ils aident à identifier et résoudre les problèmes

Level 1 - Débutant

  • Vous avez une erreur dans votre code
  • Mais vous ne savez pas exactement où ?
  • Que faites-vous ?

Vous mettez des “prints” partout

Level 2 - Mode Debug

  • Vous ajoutez un point d’arrêt
  • Vous lancez en mode debug
  • Vous avancez jusqu’à l’erreur

Demo

Level 3 - Logs

import logging

logging.basicConfig(
    filename='logs/example.log',  
    level=logging.INFO,     
    format="%(asctime)s - %(levelname)-8s - %(message)s",
    datefmt="%d/%m/%Y %H:%M:%S")

Possible d’externaliser la config dans un fichier logging_config.yml

Level 3 - Logs

logger.debug("Ceci est un message de débogage")
logger.info("Ceci est un message d'information")
logger.warning("Ceci est un message d'avertissement")
logger.error("Ceci est un message d'erreur")

Les niveaux de logs

  • DEBUG : utile pour le débogage lors du développement
  • INFO : suivi du code exécuté
  • WARNING : situation inhabituelle mais non bloquante
  • ERROR : affecte la logique du programme mais ne l’arrête pas complètement
  • CRITICAL : nécessite une intervention urgente

Un bon début

import logging

def ma_methode(a):
    logging.debug("ma_methode - DEBUT")

    ...

    logging.debug("ma_methode - FIN")

Aller plus loin

Utiliser les modules :

  • src/utils/log_init.py
  • src/utils/log_decorator.py

Et ajouter un décorateur @Log avant chaque méthode

Wrapper : va encapsuler la méthode

Démo log_decorator