CentraleSupélecDépartement informatique
Plateau de Moulon
3 rue Joliot-Curie
F-91192 Gif-sur-Yvette cedex
1CC1000 - Systèmes d'Information et Programmation - TD: Prise en main de Visual Studio Code

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.


Figure 1. Page d'accueil de VSC.

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 de Git (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.


Figure 2. L'Explorateur de VSC.

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 de a et b.


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 sur Cmd+Maj+P. Vous pouvez également cliquer sur le menu Affichage (dans la barre de menu supérieure) et sélectionner Palette 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.


Figure 3. Exécution du code Python dans VSC.

👉 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).


Figure 4. Création d'un fichier de configuration pour le débogueur.

3. Un champ de texte apparaît en haut de la fenêtre. Sélectionnez Python Debugger (Figure 5).


Figure 5. Sélection du débogueur Python.

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).


Figure 6. Sélection de la configuration de débogage.

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).


Figure 7. Démarrage du débogage.

🤔 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).


Figure 8. Ajouter un point d'arrêt.

👉 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.


Figure 9. L'environnement du débogueur.

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).


Figure 10. Valeur courante d'une variable.

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.


Figure 11. Ajouter des expressions au panneau Espion.

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.


Figure 12. Définir une nouvelle valeur d'une variable.

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).


Figure 13. Ajouter un nouveau point de journalisation.

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.


Figure 14. Modification du message d'un point de journalisation.

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).


Figure 15. Messages de journal dans la console de débogage.

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 fonction open() est souligné. Lisez attentivement le message affiché par Pylint et regardez la documentation de la fonction open() 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 fonction open().
  • 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.