Table des matières
Au cours de ce TD, vous découvrirez les principales fonctionnalités de Visual Studio Code (VSC). En particulier, vous apprendrez à :
- ouvrir un dossier contenant les fichiers d'un projet.
- reconnaître les principaux composants de l'interface de VSC.
- exécuter un script Python (avec et sans arguments).
- installer un paquet ou un module Python.
- utiliser un débogueur et un linter.
Au cours de ce TD, nous partons du principe que l'interface de votre installation VSC est en français.
Si votre interface est en anglais, nous vous recommandons vivement de configurer VSC en français :
1. cliquez sur le menu View
(dans la barre de menu supérieure) ;
2. sélectionnez Command Palette
;
3. dans le champ de texte qui apparaît, tapez la commande Configure Display Language
.
4. sélectionnez français
et redémarrez VSCode.
👉 Si vous voulez conserver l'interface en anglais, sélectionnez l'énoncé de ce TD en anglais (cliquez sur le drapeau anglais que vous trouverez en haut à gauche).
1. Préliminaires
👉 Téléchargez cette archive sur votre ordinateur.
Une archive est composée d'un ou plusieurs fichiers compressés accompagnés de métadonnées.
👉 Déplacez ce fichier du dossier Téléchargements
vers
un dossier de votre ordinateur dans lequel vous conservez habituellement vos documents.
Nous vous encourageons vivement à créer un dossier dédié à ce cours.
Vous devriez également organiser ce dossier en plusieurs sous-dossiers : par exemple,
un sous-dossier pour chaque séance de TD (par exemple, td0
, td1
...), un sous-dossier contenant les diapositives et le polycopié...
Comme l'a dit Benjamin Franklin, "Pour chaque minute passée à organiser, une heure est gagnée".
👉 Décompressez le fichier :
- Si vous utilisez Windows, vous pouvez faire un clic droit sur le fichier et choisir
Extract all
. - Si vous utilisez macOS, vous pouvez simplement double-cliquer sur le fichier. Il est également possible que le fichier soit automatiquement décompressé par votre système d'exploitation après le téléchargement.
👉 Après avoir décompressé le fichier, vous devriez obtenir un dossier nommé lab0code
.
2. Un aperçu de VSC
VSC est un éditeur de code qui offre plusieurs fonctionnalités pour faciliter le développement de logiciels.
👉 Ouvrez VSC de la même manière que vous ouvririez n'importe quel autre programme sur votre ordinateur.
Une fenêtre comme celle de la figure 1 devrait apparaître.
La barre d'activité (ang., activity bar) contient les boutons suivants :
- Le bouton Explorateur (ang., Explorer) vous donne accès au panneau
Explorateur
, où vos fichiers apparaîtront lorsque vous ouvrirez un dossier. - Le bouton Recherche (ang., Search) ouvre le panneau
Recherche
, où vous pouvez rechercher du texte dans les fichiers d'un dossier ouvert. - Le bouton Contrôle de code source (ang., Source Control) ouvre le panneau
Contrôle de code source
, où vous pouvez suivre les modifications apportées à vos fichiers à l'aide deGit
(Git sera le sujet du TD 2). - Le bouton Exécuter et déboguer (ang., Run and Debug) vous donne accès au débogueur VSC.
- Le bouton Extensions (ang., Extensions) ouvre un panneau où l'on peut installer et gérer les extensions de VSC. Les extensions sont des modules qui ajoutent des fonctionnalités à VSC.
En fonction des extensions que vous avez installées, la barre d'activité peut inclure d'autres icônes.
2.1 Ouvrir un dossier
👉 Ouvrez le dossier lab0code
dans VSC : cliquer sur Ouvrir...
dans la page d'accueil (voir Figure 1) et recherchez le dossier en utilisant le sélecteur de fichiers qui apparaît.
Au lieu de cliquer sur Ouvrir...
, vous pouvez simplement utiliser la combinaison de touches CTRL+o
(sous Windows) ou Cmd+o
(macOS).
Les fichiers du dossier ouvert (le dossier racine – root en anglais – du projet) apparaissent dans l'Explorateur
de VSC, comme le montre la figure 2.
3. Un coup d'œil rapide sur un code Python
👉 Dans l'Explorateur
, double-cliquez sur le fichier socialnet.py
.
Le fichier s'ouvre dans un onglet sur la partie droite de la fenêtre VSC.
Dans ce fichier, vous trouverez la définition d'une fonction nommée common_friends()
et,
juste après la définition, un code qui appelle la fonction :
l'appel d'une fonction déclenche l'exécution de ses instructions.
Que fait le code ? Les noms des variables sont tels que vous devriez pouvoir comprendre le code.
En particulier :
- quel est le type de l'argument de la fonction
common_friends()
? - quel est le type de la variable retournée par la fonction
common_friends()
? - décrivez ce que contient le résultat de la fonction.
ANSWER ELEMENTS
La fonction common_friends()
prend un réseau social en argument et renvoie la liste des amis communs entre deux individus du réseau social.
Même si l'on ne comprend pas tout le code, l'utilisation de noms de variables significatifs aide à comprendre l'objectif de la fonction.
En particulier :
- La fonction
common_friends()
prend en argument un dictionnaire. Chaque clé de ce dictionnaire est l'identifiant d'un individu, la valeur associée est la liste des amis de cet individu. - La fonction
common_friends()
renvoie un autre dictionnaire. Chaque clé de ce dictionnaire est une paire d'identifiants(a, b)
, la valeur associée est la liste des amis communs dea
etb
.
Cet exemple simple montre qu'il est extrêmement important de donner un nom significatif aux variables. Cela facilite grandement la compréhension du code !
Nous voulons maintenant exécuter le code. Mais avant cela, nous allons rapidement dire quelques mots sur l'environnement Python.
4. L'environnement Python
Une application Python est un ensemble de fichiers sources Python, qui sont des fichiers texte normaux.
Un fichier source est appelé :
- un script, s'il peut être exécuté directement. Le fichier
socialnet.py
est un script. - un module, s'il contient la définition de variables et l'implémentation de fonctions qui peuvent être importées dans d'autres fichiers sources.
Un fichier peut être à la fois un script et un module.
Un paquet est un groupe de modules apparentés qui, ensemble, réalisent une certaine fonctionnalité.
- Les modules d'un paquet sont souvent organisés dans une hiérarchie de dossiers et de sous-dossiers.
- Un exemple de paquet est
matplotlib
, qui contient les modules nécessaires pour créer des visualisations statiques, animées et interactives en Python.
Pour exécuter un script, vous avez besoin d'un environnement Python.
Vous devriez déjà en avoir téléchargé et installé un depuis python.org
.
L'installation comprend :
- un interpréteur Python. Un interpréteur est un logiciel capable de comprendre un programme écrit dans un langage de programmation et de l'exécuter.
- la bibliothèque standard Python, qui fournit des fonctions utiles, des types (par exemple, des entiers, des chaînes), des modules et des paquets. La liste des éléments inclus dans la bibliothèque standard est disponible ici.
- un gestionnaire de paquets appelé
pip
, un outil pour télécharger et installer des paquets et des modules Python supplémentaires non inclus dans la bibliothèque standard.
Par défaut, pip
se connecte à un dépôt en ligne de paquets, connu sous le nom d'index des Paquets Python (ang., Python Package Index). pip
peut également être configuré pour se connecter à d'autres dépôts.
👉 En fonction de votre utilisation passée de Python, plusieurs environnements Python peuvent être installés sur votre ordinateur. Vérifions si c'est le cas :
- Ouvrez la palette de commandes de VSC : si vous êtes sous Windows, appuyez simultanément sur les touches
Ctrl+Maj+P
de votre clavier ; si vous êtes sous macOS, appuyez simultanément surCmd+Maj+P
. Vous pouvez également cliquer sur le menuAffichage
(dans la barre de menu supérieure) et sélectionnerPalette de commandes
. - Un champ de texte devrait apparaître en haut de la fenêtre VSC. Tapez la commande suivante :
Python : Sélectionner un interpréteur
. - La liste des interpréteurs Python installés sur votre ordinateur devrait apparaître. Pour chacun d'entre eux, vous devriez également voir le chemin d'accès au dossier dans lequel l'interpréteur est installé.
- L'interpréteur Python actuellement utilisé devrait être mis en évidence. Assurez-vous que l'interpréteur évidencé est la dernière version que vous avez installée.
5. Exécuter le code
Sélectionnez l'onglet dans lequel le script socialnet.py
est ouvert.
L'interpréteur Python actuel doit être visible en bas à droite de la fenêtre (voir figure 3).
👉 La version que vous voyez dans la figure est plus ancienne que la version que vous devriez avoir.
👉 Cliquez sur le bouton d'exécution
(voir Figure 3) pour exécuter le script sélectionné (socialnet.py
).
Un terminal devrait automatiquement apparaître au bas de la fenêtre, où la sortie du programme est affichée.
Si le bouton d'exécution
n'apparaît pas, il se peut que vous n'ayez pas installé l'extension Python dans VSC.
5.1 Utilisation du terminal
Un terminal est une interface textuelle, où vous pouvez taper des commandes pour interagir avec le système d'exploitation.
Puisque vous avez exécuté un script dans la section précédente, le terminal devrait maintenant être visible au bas de la fenêtre.
Si ce n'est pas le cas, vous pouvez toujours ouvrir un nouveau terminal en cliquant sur le menu Terminal
(dans la barre de menu supérieure) et en sélectionnant
Nouveau terminal
.
👉 Maintenant nous allons voir comment exécuter un script Python depuis un terminal.
Utilisateurs Windows, cliquez ici
Tapez la commande suivante pour appeler l'interpréteur Python et afficher sa version :
py --version
Si vous obtenez une erreur Command not found
, essayez la commande suivante :
python --version
Utilisateurs macOS, cliquez ici
Tapez la commande suivante pour appeler l'interpréteur Python et afficher sa version :
python3 --version
La version de l'interpréteur Python affichée par la commande est-elle la même que la version qui est indiquée dans l'interface de VSC ? En cas de réponse négative, sélectionnez la version correcte dans VSC, comme nous l'avons vu précédemment.
👉 En cas de réponse positive à la question précédente, exécutez le script socialnet.py
.
Utilisateurs Windows, cliquez ici
Tapez la commande suivante :
py socialnet.py
ou
python socialnet.py
Utilisateurs macOS, cliquez ici
Tapez la commande suivante :
python3 socialnet.py
5.2 Passer des arguments
Vous pouvez passer un nombre quelconque d'arguments à un script Python.
Dans le code, vous pouvez accéder aux arguments via sys.argv
, une variable définie dans le module sys
(qui fait partie de la bibliothèque standard de Python) qui contient les arguments sous la forme d'une liste de chaînes de caractères.
Plus précisément :
sys.argv[0]
est le nom du script (socialnet_args.py
dans notre exemple).- Tout argument transmis au script sera disponible dans la sous-liste
sys.argv[1:]
.
👉 Ouvrez le fichier socialnet_args.py
dans VSC.
Ce fichier contient la définition d'une fonction common_friends()
(la même que dans le script socialnet.py
),
où le réseau social est lu à partir d'un fichier dont le nom est passé en argument.
Prenez le temps de lire le code à partir de la ligne 25 et commentez-le avec votre chargé de TD.
Notez que dans le dossier lab0code
se trouve un fichier CSV socnet.csv
qui contient un réseau social simple.
Exécutez socialnet_args.py
dans VSC en cliquant sur le bouton d'exécution.
Qu'obtenez-vous ?
👉 Si vous essayez d'exécuter le script à partir du terminal, vous obtenez le même résultat.
ÉLÉMENTS DE RÉPONSE
- Un message s'affiche indiquant que le script attend un argument que nous n'avons pas spécifié.
- Notez que le message affiché est celui que nous avons spécifié dans le code du script (lignes 25-26).
- Si nous n'avions pas écrit ces deux lignes dans le code, nous aurions obtenu une erreur de l'interpréteur Python (vous pouvez essayer : commentez les deux lignes et exécutez à nouveau le script).
👉 Lors de l'écriture du code d'un programme, nous devrions toujours anticiper les conditions d'erreur et les gérer. L'utilisateur final du programme préfère recevoir des messages d'erreur clairs plutôt que des erreurs quelque peu obscures d'un interpréteur Python.
👉 sys.exit()
est une fonction définie dans le module sys
qui met fin à l'exécution du script. La fonction prend en argument n'importe quel objet. Ici, nous lui passons un message d'erreur.
Une autre façon courante d'appeler sys.exit()
est de passer un entier représentant un code d'état : la valeur zéro est considérée comme une terminaison correcte du script et toute valeur non nulle est considérée par le terminal comme une terminaison anormale.
👉 Exécutez le script via le terminal en tapant la commande suivante :
Utilisateurs Windows, cliquez ici
py socialnet_args.py socnet.csv
ou
python socialnet_args.py socnet.csv
Utilisateurs macOS, cliquez ici
python3 socialnet_args.py socnet.csv
Vous pouvez également exécuter le script via le bouton d'exécution, mais vous devez créer une configuration pour passer les arguments. Cette méthode est plus complexe et nous ne la recommandons pas dans ce cours.
Pour en savoir plus sur cette méthode, regardez cette vidéo.
6. Installation de paquets et de modules
Si vous souhaitez télécharger et installer de nouveaux modules ou paquets qui ne font pas partie de la bibliothèque standard de Python, vous pouvez utiliser pip
.
👉 Nous allons maintenant installer le module pyperclip
, que nous utiliserons dans le TD 4.
Utilisateurs Windows, cliquez ici
Tapez la commande suivante :
py -m pip install pyperclip
ou :
python -m pip install pyperclip
Utilisateurs macOS, cliquez ici
Tapez la commande suivante :
python3 -m pip install pyperclip
👉 La commande précédente installe le nouveau module uniquement dans l'environnement Python actuel.
Si vous changez d'environnement Python, le module pyperclip
ne sera plus disponible et vous devrez le réinstaller.
Si vous consultez la page web de pyperclip
dans l'index des paquets Python,
vous verrez que la commande suggérée pour installer le module est :
pip install pyperclip
Bien que cette commande soit beaucoup plus simple que celle que vous avez tapée précédemment, vous ne pouvez l'utiliser que si vous êtes sûr que
la commande pip
fait référence à l'environnement Python actuel.
Si vous n'avez qu'un seul environnement Python installé sur votre ordinateur,
vous pouvez l'utiliser en toute sécurité. Dans le cas contraire, nous vous recommandons d'utiliser la commande proposée précédemment.
7. Débogage
Lorsque nous écrivons du code en Python ou, d'ailleurs, dans n'importe quel autre langage de programmation, nous sommes susceptibles de faire des erreurs qui entraîneront inévitablement des résultats indésirables et inattendus. Ces erreurs sont communément appelées bogues (ang., bugs).
Le processus de recherche de bogues dans un code est appelé débogage (ang., debugging) ; un logiciel qui nous aide à déboguer est appelé un débogueur (ang., debugger). Lorsque vous avez configuré VSC, vous avez installé l'extension Python qui comprend également un puissant débogueur Python.
👉 Ouvrez le script buggy.py
.
Ce script contient une implémentation boguée du Tri par insertion (ang., Insertion Sort), un célèbre algorithme pour trier une liste d'éléments.
👉 Exécutez le script.
Vous devriez confirmer que le résultat du script n'est effectivement pas ce à quoi vous vous attendiez.
👉 Configurez le débogueur.
1. Sélectionnez le bouton Exécuter et déboguer
dans la barre d'activité.
2. Le débogueur a besoin d'un fichier de configuration nommé launch.json
. Créez-en un en cliquant sur create a launch.json file
(Figure 4).
3. Un champ de texte apparaît en haut de la fenêtre. Sélectionnez Python Debugger
(Figure 5).
4. Un autre champ de texte apparaît, dans lequel vous pouvez choisir la configuration de débogage. Sélectionnez Fichier Python Déboguer le fichier Python actuellement actif
(Figure 6).
Le fichier de configuration launch.json
est affiché dans un nouvel onglet. Ce fichier est stocké dans le dossier lab0code/.vscode
.
👉 Démarrez le débogage (Figure 7).
🤔 Avez-vous remarqué que le script buggy.py
est exécuté jusqu'à sa terminaison, et que nous n'avons pas eu le temps de déboguer le code ?
C'est là que les points d'arrêt entrent en jeu.
7.1 Les points d'arrêt
Un point d'arrêt (ang., breakpoint) pointe vers une instruction d'un programme où le débogueur met en pause l'exécution. Lorsque le programme est en pause, le développeur peut regarder les valeurs actuelles des variables dans l'espoir d'obtenir des indices sur la raison du bogue.
👉 Ajoutez un point d'arrêt au début de la boucle for
, en faisant un clic la marge gauche de l'éditeur (Figure 8).
👉 Démarrez le débogueur. L'exécution devrait maintenant se mettre en pause au point d'arrêt.
Sur la gauche, vous devriez voir la valeur actuelle de toutes les variables et une barre d'outils de débogage (ang., debug toolbar) devrait apparaître (Figure 9).
Le panneau Pile des appels
(ang., Call stack
) indique que l'instruction en cours d'exécution est dans la fonction insertion_sort()
définie dans le module buggy.py
.
7.2 Barre d'outils de débogage
Nous allons maintenant apprendre à utiliser les boutons de la barre d'outils du débogueur.
Si vous devez redémarrer le débogueur à tout moment, vous pouvez cliquer sur le bouton Rédemarrer
(ang., Restart
) .
👉 Assurez-vous que vous avez ajouté un point d'arrêt, comme indiqué dans la Figure 8.
Cliquez sur le bouton Continuer/Pause
jusqu'à ce que le programme se termine.
Chaque fois que vous cliquez sur le bouton, observez comment les valeurs des variables changent.
Décrivez le comportement du débogueur.
ÉLÉMENTS DE RÉPONSE
Chaque fois que nous cliquons sur le bouton, une itération de la boucle for
est exécutée et l'exécution s'arrête au point d'arrêt.
Lorsque la boucle se termine, le script est exécuté jusqu'à la fin.
Effectuez les actions suivantes :
- Démarrez le débogueur.
- Désactivez le point d'arrêt : faites un clic droit sur le point d'arrêt et sélectionnez
Désactiver Point d'arrêt
. - Cliquez sur le bouton
Continuer/Pause
une seule fois.
Que se passe-t-il ? En quoi le comportement du débogueur diffère-t-il de ce que vous avez observé auparavant ?
ÉLÉMENTS DE RÉPONSE
Initialement, le débogueur met l'exécution en pause au point d'arrêt. Après avoir supprimé le point d'arrêt, l'exécution est toujours en pause.
Lorsque nous cliquons sur le bouton Continuer/Pause
, le script est exécuté jusqu'à la fin.
Le bouton Continuer/Pause
peut également être utilisé pour mettre en pause une longue exécution.
👉 Activez le point d'arrêt (clic droit sur le point d'arrêt gris et sélectionner Activer Point d'arrêt
) et redémarrez le débogueur.
Cliquez sur le bouton Pas à pas sortant
(ang., Step out
) jusqu'à ce que le programme se termine. Observez les valeurs des variables. Que se passe-t-il ?
En quoi le comportement du débogueur diffère-t-il de ce que vous avez observé lorsque vous avez utilisé le bouton Continuer/Pause
?
ÉLÉMENTS DE RÉPONSE
Comme précédemment, chaque fois que nous cliquons sur le bouton, une itération de la boucle for
est exécutée. Cependant, lorsque la boucle est terminée, le script n'est pas exécuté jusqu'à la fin. Il est plutôt mis en pause à la ligne 14, où la fonction insertion_sort()
est appelée. Nous comprenons que l'objectif du bouton Pas à pas sortant
est d'exécuter ce qui reste d'une fonction et de quitter la fonction (à moins qu'il ne tombe sur un point d'arrêt, auquel cas il se met en pause).
👉 Redémarrez le débogueur.
Cliquez plusieurs fois sur le bouton Pas à pas principal
(ang., Step Over
) . Que se passe-t-il ?
ÉLÉMENTS DE RÉPONSE
Chaque fois que nous cliquons sur le bouton, une seule instruction est exécutée.
👉 Redémarrez le débogueur en cliquant sur le bouton Rédemarrer
.
Cliquez plusieurs fois sur le bouton Pas à pas détaillé
(ang., Step Into
) . Que se passe-t-il ? Le comportement du débogueur est-il différent de celui que vous aviez observé lorsque vous utilisiez le bouton Pas à pas principal
?
ÉLÉMENTS DE RÉPONSE
Non, nous observons exactement le même comportement.
👉 Supprimez le point d'arrêt en cliquant simplement dessus, et ajoutez un nouveau point d'arrêt à la ligne 14 (où la fonction insertion_sort()
est appelée).
👉 Redémarrez le débogueur en cliquant sur le bouton Rédemarrer
.
Cliquez sur le bouton Pas à pas principal
une seule fois. Que se passe-t-il ?
ÉLÉMENTS DE RÉPONSE
La fonction insert_sort()
est exécutée comme une instruction atomique unique. Le débogueur n'a pas parcouru chaque instruction de la fonction. Nous pouvons utiliser le bouton Pas à pas principal
lorsque nous avons l'intention d'ignorer les détails de l'exécution d'une fonction parce que nous pensons que cette fonction n'est pas à l'origine du bogue.
👉 Redémarrez le débogueur en cliquant sur le bouton Rédemarrer
.
Cliquez plusieurs fois sur le bouton Pas à pas détaillé
. Que se passe-t-il ? Le résultat est-il différent de celui obtenu lorsque vous avez utilisé le bouton Pas à pas principal
?
ÉLÉMENTS DE RÉPONSE
Cette fois, la fonction insertion_sort()
est exécutée instruction par instruction. Nous comprenons maintenant la différence entre les boutons Pas à pas principal
et Pas à pas détaillé
.
👉 Arrêtez le débogueur en cliquant sur le bouton Arrêter
(ang., Stop
) .
7.3 Fonctionnalités supplémentaires du débogueur
Avant d'utiliser le débogueur pour trouver le bogue dans le script buggy.py
, examinons d'autres fonctionnalités du débogueur.
Manipulation de variables
En plus du panneau Variables
, vous pouvez consulter la valeur d'une variable en passant simplement la souris dessus (Figure 10).
Vous pouvez ajouter des expressions dans le panneau Espion
(ang., Watch
) (Figure 11). Dans notre exemple, la fonction insertion_sort()
ne doit pas ajouter de valeur à la liste donnée en argument. Nous pouvons donc ajouter des expressions pour confirmer que c'est bien le cas.
Vous pouvez définir manuellement la valeur d'une variable en faisant un clic droit sur le nom de la variable dans le panneau Variable
(Figure 12). Cette option est utile lorsque vous souhaitez modifier l'entrée d'une fonction et observer son comportement.
Les points de journalisation
En plus des points d'arrêt, VSC fournit un autre outil appelé points de journalisation (ang., logpoints). Le but d'un point de journalisation n'est pas de mettre en pause l'exécution du programme, mais plutôt d'afficher un message lorsque l'exécution atteint le point de journalisation. Vous pouvez ajouter un point de journalisation en faisant un clic droit à gauche d'un numéro de ligne et en sélectionnant Ajouter un point de journalisation
(Figure 13).
Vous pouvez ensuite spécifier un message de journal (ang., log) (Figure 14). Le message de journal peut également inclure des expressions Python entre accolades. Dans la figure 14, lorsque le point de journalisation est atteint par l'exécution du programme, les valeurs {i}
, {j}
, {arr}
et {key}
sont remplacées par les valeurs actuelles des variables correspondantes.
👉 Lorsque vous avez fini de modifier le message, vous devez appuyer sur la touche Entrée
.
Lorsque vous exécutez le débogueur, les messages de journal s'affichent dans la console de débogage lorsque le point de journalisation est atteint (figure 15).
7.4 Trouver le bogue
Utilisez le débogueur pour trouver le bogue dans le script buggy.py
.
Corrigez le bogue et vérifiez que le résultat est correct.
ÉLÉMENTS DE RÉPONSE
Si nous plaçons un point d'arrêt au début de la boucle while
, et que nous exécutons le code instruction par instruction, nous nous rendons immédiatement compte qu'à la fin de la première itération, la valeur 11 est placée à la fin de la liste, au lieu d'être placée au début.
Or, à la fin de la première itération de la boucle while
, la valeur de la variable j
est -1 (ce qui indique la fin de la liste).
Le problème vient de l'instruction de la ligne 11, qui devrait être arr[j+1] = key
.
Notez que le linter met en évidence certains problèmes dans le code. De plus, le code n'a pas de docstring ni de commentaires. Vous devriez être en mesure de corriger ces problèmes par vous-même.
8. Linting
Dans les fichiers socialnet.py
et socialnet_args.py
, vous devriez voir des soulignements ondulés bleues et jaunes.
Ces soulignements sont ajoutés par l'une des extensions que vous avez installées lorsque vous avez configuré VSC : Pylint
.
Pylint
est un linter très utilisé, un programme qui lit et analyse le code source d'un programme afin de mettre en évidence des constructions problématiques qui
peuvent produire une erreur lors de l'exécution du programme.
En 1978, Stephen C. Johnson, chercheur aux laboratoires Bell, a écrit un programme capable de détecter un certain nombre de bogues et de constructions problématiques dans le code C. Il a nommé le programme d'après les peluches de votre pull-over lorsque vous le sortez de la machine à laver : Lint.
Notez qu'un linter n'exécute pas un programme pour découvrir les problèmes ; il le fait en lisant uniquement le code source. Ce processus est appelé analyse statique.
👉 Pour lire les messages du linter, il suffit de passer la souris sur les soulignements. Les messages sont en anglais, même si l'interface de votre VSC est en français.
👉 La couleur du soulignement indique la gravité du problème. Le bleu est utilisé pour toute information quant aux conventions non respectées dans le code ; le jaune est utilisé pour les avertissements, quelque chose qui pourrait entraîner une erreur lors de l'exécution du script.
Pouvez-vous comprendre, décrire et résoudre chaque problème signalé par Pylint
dans les fichiers socialnet.py
et socialnet_args.py
?
Voici quelques conseils pour vous aider :
- Certains problèmes sont liés à une docstring manquante. Une docstring est une chaîne de caractères spécifiée dans le code source qui est utilisée, comme un commentaire, pour documenter un segment spécifique de code, tel qu'un script, un module ou une fonction. N'hésitez pas à regarder sur Internet pour savoir comment ajouter une docstring dans le code.
- Dans le fichier
socialnet_args.py
, l'appel à la fonctionopen()
est souligné. Lisez attentivement le message affiché parPylint
et regardez la documentation de la fonctionopen()
pour savoir comment résoudre le problème.
ÉLÉMENTS DE RÉPONSE
Dans le fichier socialnet.py
, deux problèmes sont signalés :
- Le premier (souligné en bleu) indique que la docstring de la fonction
common_friends()
est manquante. - Le second (souligné en jaune) indique que le nom
common_friends
, défini dans la portée (ang., scope) externe, est redéfini.
👉 La couleur des soulignements indique la gravité du problème. Le bleu est utilisé pour toute information quant aux conventions non respectées dans le code ; le jaune est utilisé pour les avertissements, quelque chose qui pourrait entraîner une erreur lors de l'exécution du script ; le rouge est utilisé pour signaler des problèmes graves, tels que des erreurs de syntaxe qui entraîneront certainement une erreur lors de l'exécution du code.
Le premier problème concerne une docstring manquante.
Une docstring est une chaîne de caractères insérée dans le code source qui est utilisée, comme un commentaire, pour documenter une portion spécifique de code, tel qu'un script, un module ou une fonction. Contrairement aux commentaires, les docstrings sont conservés tout au long de l'exécution du programme. Cela permet au programmeur d'inspecter ces commentaires au moment de l'exécution.
Les conventions relatives aux docstrings sont décrites dans le PEP 257 (les PEP, ou Python Enhancement Proposals, sont des documents décrivant plusieurs aspects de Python, y compris les styles de codage et des recommandations pour de nouvelles fonctionnalités).
La docstring d'une fonction doit comprendre : une ligne avec un résumé de ce que fait la fonction ; une ligne vide ; d'autres lignes avec des détails sur la fonction, le cas échéant ; une ligne vide suivie des arguments et de la valeur de retour.
Voici un exemple pour la fonction common_friends()
:
👉 Habituez-vous à écrire les commentaires en anglais. Cela permet de rendre votre code compréhensible à tout le monde. Cela va de même pour les noms de variables.
def common_friends(friendships): """Returns the common friends of any two individuals in a social network. The function does not return symmetric pairs. The pair (a, b) is considered the same as the pair (b, a). Parameters ---------- friendship: dict The input social network. Each key in this dictionary is the identifier of an individual. The value associated to an individual identifier is the list of friends of that individual. Returns ------- dict Each key of this dictionary is a pair of identifiers of individuals (a, b); the associated value is the list of the identifiers of the common friends of a and b. """ common_friends = {} for person1, person1_friends in friendships.items(): for person2, person2_friends in friendships.items(): if person1 != person2: key = (person1, person2) if person1 < person2\ else (person2, person1) if key in common_friends: continue common = list(set(person1_friends) & set(person2_friends)) common_friends[key] = common return common_friends
Après avoir écrit la docstring pour la fonction common_friends()
, le linter devrait encore souligner le mot def
en bleu.
C'est parce qu'il faut encore écrire une docstring associée au script dans son ensemble, expliquant ce que fait le script.
Pour faire disparaître le soulignement, vous pouvez ajouter la docstring suivante au début du script :
"""Definition and test of a function that returns common friends in a social network. This script is only used for educational purposes. """
N'oubliez pas de laisser un espace vide après la fin d'une docstring.
Le deuxième problème concerne l'utilisation du même nom (common_friends
) pour désigner deux choses différentes (une fonction et un dictionnaire).
C'est en effet quelque chose qui est déconseillé. Nous pouvons par exemple renommer la fonction en find_common_friends()
.
La manière la plus rapide de renommer un symbole est de faire un clic droit sur le symbole et de sélectionner l'option Renommer le symbole
.
Cela permet de s'assurer que le symbole et toutes les références à celui-ci sont mis à jour.
Dans notre cas, la fonction common_friends()
est référencée deux fois : lorsqu'elle est définie et lorsqu'elle est appelée.
Si l'option Renommer le symbole
n'apparaît pas, assurez-vous que l'extension Pylance est installée et activée.
Si ce n'est pas le cas, installez-la, activez-la et redémarrez Visual Studio Code.
Dans le fichier socialnet_args.py
, en plus des problèmes discutés ci-dessus, nous trouvons également :
- un problème à la ligne 32, car nous ouvrons un fichier sans spécifier son encodage. Il suffit d'ajouter
encoding='utf-8'
aux arguments de la fonctionopen()
. - un problème à la ligne 44, parce que nous devrions laisser une ligne vide à la fin d'un fichier Python. En effet, certains outils s'attendent à ce que le dernier caractère d'un fichier texte soit une nouvelle ligne.
Vous devriez toujours examiner attentivement tous les problèmes signalés par le linter. Non seulement le linter vous aide à utiliser des conventions de programmation établies, mais il vous évite également de rencontrer des erreurs lors de l'exécution d'un programme.
En savoir plus sur Visual Studio Code
Si vous souhaitez en savoir plus sur Visual Studio Code, nous vous recommandons vivement les vidéos d'introduction disponibles sur le site officiel.
QCM de révision
Nous vous recommandons le QCM de révision pour vérifier vos connaissances après cette séance de TD. Ne vous inquiétez pas, vous pouvez faire le QCM autant de fois que vous le souhaitez, et la note n'a pas d'impact sur la note finale.