Projet NSI - Reversi en Python, par où commencer ?

19BlueMonkey92 Messages postés 18 Date d'inscription jeudi 30 décembre 2021 Statut Membre Dernière intervention 6 janvier 2024 - 6 janv. 2024 à 18:02
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 9 janv. 2024 à 09:58

Salut à tous,

Pour un projet en NSI (Terminale), je dois écrire et documenter un programme en Python simulant un jeu de Reversi (ou Othello).

Certains codes (un peu datés) sont proposés sur la fiche explicative du projet.
Sauf qu'ils sont assez vagues faute d'explications détaillées du code.

De plus, je suis la spécialité par le CNED, donc pour obtenir de l'aide je dois contacter un prof sachant qu'ils mettent toujours un peu de temps à répondre (au moins 1 jour) + c'est encore les vacances.

Je suis donc complètement perdu, je ne sais pas par où commencer exactement en plus de ne pas avoir bien compris le jeu. J'utilise Python 3.10 sous Visual Studio Community.

Je suis donc à la recherche de conseils qui pourraient m'indiquer par où commencer, quelles bibliothèques à utiliser, ou juste comment mener à bien ce genre de projet seul (recherches, rester motivé, etc.).

Merci d'avance.

Windows / Chrome 120.0.0.0

6 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 8 janv. 2024 à 12:41

Salut 19BlueMonkey92,

je ne sais pas quoi faire en premier, le plateau ? La validité d'un pion ? Une classe joueur ?

Moi de commencerai par le site de la Fédération Française d'Othello :

Une fois que tu connais cela, tu es capable de décrire le comportement du jeu en français. Commence à coder ces comportements un par un.

Pour la stratégie, tu peux commencer par une stratégie très nulle : l'ordinateur passe en revue toutes les cases et s'il peut jouer un coup en posant un pion sur cette case, il le fait sur la première case qu'il rencontre. Ou il recense toutes les cases où il est possible de jouer un coup et il en joue une au hasard.

Pour la stratégie, tu peux donc faire très simple et avoir un jeu fonctionnel de A à Z. Tu peux ensuite aussi faire bien mieux, voire très compliqué.

Si tu arrives à implémenter Minimax, cela sera déjà bien sans doutes dans le cadre de ton exercice. Cette dernière page parle d'algorithmes bien plus avancés.

Je pense que je vais un peu m'entraîner à la POO en Python avant de passer à la partie pratique

Quelle drôle d'idée. On t'impose de faire de l'orienté objet ?

Fais comme tu veux.

Une bonne approche est de programmer ton jeu pour que son fonctionnement interne soit indépendant de l'affichage et de l'interface homme machine, pour que tu puisses commencer en faisant simple avec un programme console et que tu t'embarrasses d'une interface graphique si tu as le temps et la motivation (surtout si ce n'est pas obligatoire dans ton énoncé de le faire). Tu peux le faire en utilisant l'OO mais tu peux aussi faire sans.

2
19BlueMonkey92
9 janv. 2024 à 08:29

Pour les règles du jeu je les regarderai quand je vais programmer le fonctionnement du jeu, pour l'instant j'ai seulement une classe Plateau fonctionnant à l'aide d'une matrice, avec possibilité de remplacer les cases "vides" pas des pions. Je compte implémenter une règle pour que les pions ne soient pas n'importe quoi, puis implémenter une classe joueur qui permet à l'utilisateur de placer des pions.

Pour la POO, comme c'est cette année qu'on l'a vu je pense que c'est obligatoire d'en faire, en plus je juge ça nécessaire pour certaines fonctionnalités complexes.

1
jee pee Messages postés 39650 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 26 avril 2024 9 238
Modifié le 6 janv. 2024 à 19:09

Bonjour,

D'abord quel est ton niveau en programmation, qu'as tu déjà réalisé, et pareil avec Python ?

Premièrement il te faut arriver à comprendre et maitriser les règles du jeu lui-même. Donc entraine toi.

Intuitivement, on va devoir utiliser une bibliothèque graphique, pour dessiner un plateau et déplacer les pions. Si on te demande un affichage graphique ? Dans les codes fournis, des bibliothèques sont-elles mentionnées ? Y a-t-il des fonctions avec certaines actions mentionnées ?

On va avoir le joueur humain qui va placer un pion, il va falloir contrôler que son placement respecte les règles, puis réaliser le basculement des pions adverses.

L'autre joueur c'est le système. On peut commencer à écrire le programme en le faisant jouer sur le 1er emplacement possible pour lui. Puis dans un second temps, une fois que toute la dynamique du programme fonctionne, imaginer qu'il joue avec une stratégie, donc trouver pour lui le meilleur emplacement possible. Par exemple tester toutes les cases jouables et chercher celle qui fait basculer le plus de pions adverses.


0
19BlueMonkey92 Messages postés 18 Date d'inscription jeudi 30 décembre 2021 Statut Membre Dernière intervention 6 janvier 2024 19
Modifié le 6 janv. 2024 à 19:33

Merci pour ta réponse

 >> D'abord quel est ton niveau en programmation, qu'as tu déjà réalisé, et pareil avec Python ?

Je dirais que je suis un peu au dessus du niveau débutant, un poil en dessous en Python (j'utilise surtout C++), en programmes déjà réalisés je pourrais te donner en Python un jeu du pendu (https://drive.google.com/file/d/15t7zC1MU3lyrznfWgTh6ZT0HnpoJBwTN/view?usp=sharing) que j'ai réalisé à la fin de l'année dernière en groupe sur environ 2 semaines, ou ce programme simulant un jeu de combat au tour par tour en C++ en 3 semaines seul (https://drive.google.com/drive/folders/1YOZGxf6UfwBUMKXgvoNUrbdxUizYY2i0?usp=drive_link). Ces jeux sont nettement plus simples étant donné qu'il n'y a pas de calculs de positions précises ou d'interfaces graphiques (pseudo ou non), et j'avais des bases pour partir comparé à ce nouveau projet que je dois faire seul sans bases pendant 3 mois.

>> Premièrement il te faut arriver à comprendre et maitriser les règles du jeu lui-même. Donc entraine toi.

C'est ce que je vais faire, je vais chercher des tutos sur YouTube, ça devrait être plus simple à trouver déjà.

>> Intuitivement, on va devoir utiliser une bibliothèque graphique, pour dessiner un échiquier et déplacer les pions. Dans les codes fournis, des bibliothèques sont-elles mentionnées ? Y a-t-il des fonctions avec certaines actions mentionnées ?

Dans les exemples de code, il y a wxPython qui était utilisée mais je n'ai pas compris quand elle était utilisée et à quoi elle servait, je pense que je vais me renseigner là dessus, idem pour les bibliothèques graphiques en Python, voilà l'un des codes proposés : pyReversi. (developpez.com).

>> On va avoir le joueur humain qui va placer un pion, il va falloir contrôler que son placement respecte les règles, puis réaliser le basculement des pions adverses.

L'autre joueur c'est le système. On peut commencer à écrire le programme en le faisant jouer sur le 1er emplacement possible pour lui. Puis dans un second temps, une fois que toute la dynamique du programme fonctionne, imaginer qu'il joue avec une stratégie, donc trouver pour lui le meilleur emplacement possible.

C'est là que je bloque, je ne sais pas quoi faire en premier, le plateau ? La validité d'un pion ? Une classe joueur ?

0
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
7 janv. 2024 à 11:24

bonjour,

Un projet à faire seul pendant 3 mois, le but n'est-il pas précisément de faire preuve d’autonomie, d’initiative et de créativité?

N'hésite pas à explorer, à te tromper, et à recommencer.

0
19BlueMonkey92 > yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024
7 janv. 2024 à 13:18

J'ai recommencé le projet récemment en faisant sans modèle, avec ça j'ai commencé à créer une classe plateau, qui utilise une matrice avec un système de coordonnées (que j'essaie d'implanter malgré des difficultés), sur lequel on peut placer des pions. L'affichage essaye d'être du pseudo graphique. Je pense que je vais demander de l'aide sur developpez.com, j'aurais pas dû commencer par chercher les programmes déjà faits qui ne sont pas à prendre pour des T.P.

0
jee pee Messages postés 39650 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 26 avril 2024 9 238
Modifié le 6 janv. 2024 à 20:33

L'exemple que tu donnes a effectivement 16 ans, je ne sais pas si la bibliothèque wxPython est encore largement utilisée aujourd'hui, mais elle est toujours maintenue et mise à jour. Le code est en Python 2.

Il y a quelque chose qui m'échappe, quand on te demande de développer un jeu et que l'on te donne un exemple fonctionnel avec les sources. Comment faut-il le comprendre, comment se situer dans ce contexte ? Moi je prends les sources, peut être que je j'utilise une autre bibliothèque graphique plus récente et j'adapte le tout. Créativité faible ;-)

Quelles étapes pour le développement ? Chacun peut avoir son idée.

Je commencerais par dessiner le plateau, afficher les pions contenu dans un tableau (contenant 2 blancs, 2 noirs au centre au début), compter le nombre de pions de chaque joueur, rajouter un pion (peut être en saisie manuelle  position h/v, avant de le réaliser plus tard en utilisant un clic souris sur le plateau), vérifier s'il respecte les règles de placement, inverser les pions adverses suite à un nouveau pion.

C'est une démarche où visuellement le projet avance, qui permet d'avoir une première satisfaction quand la partie graphique est opérationnelle. Avant d'attaquer la partie pour moi la plus délicate, la mise en place de la stratégie de "l'ordinateur" pour gagner.


0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
19BlueMonkey92 Messages postés 18 Date d'inscription jeudi 30 décembre 2021 Statut Membre Dernière intervention 6 janvier 2024 19
6 janv. 2024 à 23:42

>> L'exemple que tu donnes a effectivement 16 ans, je ne sais pas si la bibliothèque wxPython est encore largement utilisée aujourd'hui, mais elle est toujours maintenue et mise à jour. Le code est en Python 2.

Ok donc c'est bien un peu daté (obsolète peut-être).

>> Il y a quelque chose qui m'échappe, quand on te demande de développer un jeu et que l'on te donne un exemple fonctionnel avec les sources. Comment faut-il le comprendre, comment se situer dans ce contexte ? Moi je prends les sources, peut être que je j'utilise une autre bibliothèque graphique plus récente et j'adapte le tout. Créativité faible ;-)

Autant mes 2 projets précédents j'ai réussi mais là, je bloque, j'ai essayé d'entrer le code avec une impression qu'il me manquait quelque chose, comme si le programme n'allait pas fonctionner à cause d'un potentiel manque d'instructions. De plus, pour cet exemple, je pense que j'aurais mieux fait de partir sans code pour me faire une première version, ce qui ne m'aurait embrouillé dans mon planning, puis aller checker d'autres codes. En bref je vais complètement me détacher de ce code qui au début me semblait être une sorte de T.P mais qui au final m'embrouille plus qu'autre chose. Je pense que je vais un peu m'entraîner à la POO en Python avant de passer à la partie pratique.

>> Quelles étapes pour le développement ? Chacun peut avoir son idée.

Je commencerais par dessiner le plateau, afficher les pions contenu dans un tableau (contenant 2 blancs, 2 noirs au centre au début), compter le nombre de pions de chaque joueur, rajouter un pion (peut être en saisie manuelle  position h/v, avant de le réaliser plus tard en utilisant un clic souris sur le plateau), vérifier s'il respecte les règles de placement, inverser les pions adverses suite à un nouveau pion.

Je pense que je vais opter sur la création d'un plateau (en pseudo-graphique/console par contre), où je peux juste placer des pions noirs ou blancs, le reste je me déciderais après. Chaque tour il est modifié et est affiché. Est-ce que cette première approche te semble correcte ?

>> C'est une démarche où visuellement le projet avance, qui permet d'avoir une première satisfaction quand la partie graphique est opérationnelle. Avant d'attaquer la partie pour moi la plus délicate, la mise en place de la stratégie de "l'ordinateur" pour gagner.

L'ordinateur passera à la fin quand le jeu sera fonctionnel déjà, je ne suis pas sûr d'utiliser une bibliothèque graphique pour le moment, mais déjà faut-il que j'apprenne à en utiliser une, pour qu'il y ait au moins un système de coordonnées, de plateau, et de classes interagissant avec la fenêtre.

Je pense que je te partagerai mes avancées ces prochains jours.

0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié le 9 janv. 2024 à 03:42

Bonjour,

Quelques éléments de réponses

Conseils de bases

  • Comme le dit [Dal] la première chose à faire, c'est de comprendre les règles du jeu et peut-être de faire quelques parties.
  • Othello est un jeu qui utilise une grille. Comme ça ne semble pas imposé par l'énoncé, tu peux sans doute te contenter de représenter le plateau de jeu par du texte (par exemple . pour une case vide, X pour un pion noir, O pour un pion blanc).
    • Il sera toujours temps de faire une interface graphique plus tard quand le moteur du jeu fonctionnera.
    • De nombreux modules python peuvent alors être considérés (tkinter, GTK, PyQT...). Toutefois, je te conseille vivement de ne pas te préoccuper de l'interface graphique dans un premier temps. Garde ça vraiment pour la fin.
  • Pour stocker ton plateau, tu peux utiliser une liste de liste. À toi ensuite d'écrire les bonnes boucles pour réaliser toutes les primitives
    • Vérifier si une case est jouable
    • Jouer un coup sur une case jouable
    • Vérifier s'il y a un vainqueur (et le cas échéant, quel est-il)
  • Commence simple. Ajoute petit à petit des fonctionnalités. Programme proprement (les paramètres de tes fonctions doivent être légitimes). Interdis-toi les variable globales.
  • Teste ton programme régulièrement. Comme ça, ce qui pose problème vient très probablement de ce que tu viens de programmer.

Conseils avancés

Attention, les conseils qui suivent sont probablement trop avancés à ce stade, mais qui sait, il te restera peut-être du temps et de l'énergie pour les explorer. Alors à toutes fins utiles, voici quelques conseils supplémentaires...

  • Si tu sais utiliser git (par exemple sur github), l'idéal serait de créer dès le début un dépôt et d'y publier petit ton travail. Si tu ne sais pas de quoi je parle, ignore cette remarque.
  • On te demande de documenter ton code. Je te conseille de documenter ton code au fur et à mesure. En python on utilise des docstrings. Il existe principalement deux syntaxes :
    • la syntaxe numpy
    • la syntaxe google.
    • Je recommande la syntaxe google qui est plus concise (voir ce tutoriel). À terme, la documentation se génère avec un module python (en général sphinx).
    • Je ne pense pas que ton enseignant demande de générer la documentation, donc tu peux sans doute ignorer tout ce qui concerne sphinx dans un premier temps, mais je te recommande de prendre tôt les bonnes habitudes pour écrire des docstrings correctes.
  • Je ne connais pas VSCode community. Personnellement je te conseillerais Pycharm. Mais si tu es à l'aise avec VSCode, continue avec VSCode.
  • Dans tous les cas, je t'incite à installer flake8 et le lancer sur ton code pour vérifier le contrôler. Ça te permettra d'écrire "proprement" et de corriger des étourderies de code. Pour installer le module python flake8, tape simplement :
    pip install flake8
    flake8 src/  # Valider les fichiers .py dans le dossier src/
  • Si tu as envie de packager ton travail dans un module python, il existe principalement deux écoles : setuptools et poetry (je recommande poetry). Encore une fois ça ne fait pas partie de tes consignes, donc tu peux parfaitement ignorer cette remarque.
    pip install poetry
    poetry init  # Créer un projet

    Généralement on met les sources dans le dossier src/ et les tests dans le dossiers tests/. Poetry crée un module à partir de tes sources sous la forme d'un paquet python ".whl" (appelé wheel) dans le dossier dist/. Une wheel installable avec pip.

    poetry lock            # Répercute les dépendances définies dans pyproject.toml dans poetry.lock
    poetry install         # Installe les dépendances définies dans poetry.lock
    poetry build           # Crée dist/*.whl
    pip install dist/*whl  # Installe le paquet python
  • Vu que tu fais partie de la jeune génération, on t'a sans doute enseigné à programmer avec des tests, ce qui est plutôt une bonne habitude. En python, on utilise souvent pytest. Généralement, on crée un fichier de test par fichier ".py" dans les source.)

    pip install pytest
    pytest tests/  # Lance les tests stockés dans les fichiers tests/test_*.py
  • Il existe des outils (comme cookie cutter ou package helper) qui permettent de générer un squelette de projet mettant en jeu tous les outils que je viens de mentionner. Personnellement je ne les utilise pas, mais c'est sans doute intéressant quand on débute.

Bonne chance

0
19BlueMonkey92
9 janv. 2024 à 09:18

Bonjour,

Quelques éléments de réponses

Conseils de bases

  • Comme…

>> Ça oui, je le ferai, j'ai déjà fait quelques parties (ou je me faisais pulvériser :( mais il faudrait que je regarde comment jouent ceux qui ont de l'expérience histoire de bien programmer l'ordinateur contre lequel jouera le joueur mais ce n'est pas mon objectif actuel).

  • Othello …

>> J'ai commencé à programmer une classe plateau, donc j'ai la grille (qui s'affiche dans la console). T ki n ter me semble plus adapté aux logiciels demandant de cliquer sur une fenêtre.

  • Pour…

>> Pour l'instant, la classe que j'ai implémenté ne permet que de déposer des pions, mais je n'ai pas encore établi plus de règles, déjà une règle pour que les pions ne soient pas n'importe quoi. Je pense que j'implémenterai le respect des règles du Reversi dans la classe Joueur que j'implémenterai prochainement, pour qu'il puisse placer un pion il faudra que le pion passe par quelques fonctions de test.

  • Commence simple…

>> C'est ce que j'ai vu dans un des exemples de codes proposés, w x Reversi, vraiment les variables globales, c'est ce qui me semble le plus illogique dans les programmes utilisant beaucoup de POO.

  • Teste…

>> J'ai déjà testé mon plateau et il fonctionne bien, il s'affiche correctement et se met à jour correctement, je pense que c'est un bon début.

Conseils avancés

Attention, les conseils qui suivent sont probablement trop avancés à ce stade, mais qui sait, il te restera peut-être du temps et de l'énergie pour les explorer. Alors à toutes fins utiles, voici quelques conseils supplémentaires…

  • Si tu sais…

>> Je l'ai déjà utilisé pour un ancien projet en C++, mais je compte le déposer une fois le projet finalisé voire après à la fin de l'année.

  • On te demande…

>> La documentation c'est mon gros défaut, je l'apprendrai avant de m'attaquer à la partie graphique (que j'attaquerai en dernier).

  • Je ne connais pas VS Code…

>> VS Community, c'est un logiciel qui permet d'écrire son code, mais qui sert aussi d'interprétateur et de compilateur, tout est facilité, pas besoin d'utiliser beaucoup de lignes de commande pour paramétrer son projet, accès à git facilement, tout ça grâce à une interface graphique réussie.

  • Dans tous les cas…
  • Si tu as envie…
  • Vu que…

  • Il existe des outils…

>> Je me renseignerai sur les bibliothèques, à part la bibliothèque standard je ne m'y connais pas du tout, je verrai si je vais les utiliser. Pour les tests, je réutiliserai ce que j'ai fait en première, on importe un fichier, je ne me souviens plus de son nom mais je dois l'avoir dans mes fichiers perso, et on insère dans les commentaires des lignes de test pour vérifier si tout s'est bien passé pendant l'exécution.

0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749 > 19BlueMonkey92
Modifié le 9 janv. 2024 à 10:16

>> C'est ce que j'ai vu dans un des exemples de codes proposés, w x Reversi, vraiment les variables globales, c'est ce qui me semble le plus illogique dans les programmes utilisant beaucoup de POO.

Oui, sache que normalement tu peux toujours te passer de variables globales. Et j'ai bien dit toujours (dans le pire des cas, on utilise ce qu'on appelle un singleton). Mais ça ce sont des notions avancées dont tu n'as pas besoin à ce stade.

>> J'ai déjà testé mon plateau et il fonctionne bien, il s'affiche correctement et se met à jour correctement, je pense que c'est un bon début.

Oui, bon début :-)

>> Je l'ai déjà utilisé pour un ancien projet en C++, mais je compte le déposer une fois le projet finalisé voire après à la fin de l'année.

Dans ce cas, si tu connais git, autant le faire dès le début. À chaque fois que tu veux faire un point de sauvegarde, ajoute les nouveaux fichiers et les fichiers modifiés :

git status
git add ajout1.py ajout2.py modifie1.py modifie2.py
git commit -m "Bref résumé des modifications"
git push

C'est extrêmement commode, car si tu te trompes, tu peux facilement revenir au dernier point de sauvegarde (git checkout master). Et accessoirement, c'est une bonne habitude à prendre dès le début. Inutile à ce stade de te lancer dans des utilisations plus complexes de git (branches, etc...), ça viendra plus tard.

>> La documentation c'est mon gros défaut, je l'apprendrai avant de m'attaquer à la partie graphique (que j'attaquerai en dernier).

Je te conseille vivement de la faire au fur et à mesure car sinon tu vas mourir de désespoir au moment de le faire. Note qu'avec un IDE python, il y a un souvent un raccourci clavier pour générer le squelette de la docstring (c'est le cas dans PyCharm), et il ne reste qu'à boucher les trous (voir ici). Pense alors à indiquer dans PyCharm au préalable si tu veux faire des docstrings avec le style numpy ou le style google, en fonction de tes préférences.

>> VS Community, c'est un logiciel qui permet d'écrire son code, mais qui sert aussi d'interprétateur et de compilateur, tout est facilité, pas besoin d'utiliser beaucoup de lignes de commande pour paramétrer son projet, accès à git facilement, tout ça grâce à une interface graphique réussie.

Je connais l'esprit, je dis juste que je ne l'ai jamais utilisé ;-)

>> Je me renseignerai sur les bibliothèques, à part la bibliothèque standard je ne m'y connais pas du tout, je verrai si je vais les utiliser.

On ne parle pas de bibliothèque en python (même si c'est l'idée) plutôt de package ou de module. Il y en a plein, l'idéal est de voir lequel est le plus adapté en fonction de tes besoins.

Quelques modules classiques (pas forcément en rapport de ton projet)

  •  Interface graphique (toutes ont leur avantages et inconvénient)
    • turtle : bien pour dessiner, mais pas plus ; peut rattraper des événements clavier et souris (ça peut donc convenir pour un petit jeu), mais contrairement à ceux qui suivent, il n'y a pas de "widgets" (boutons, liste déroulante, champ de saisie, case à cocher, etc.)
    • tkinter : avantage, c'est "de base" ; inconvénient, c'est moyennement documenté contrairement à celles qui suivent
    • PyQt : c'est celle que j'utiliserais personnellement, Qt est très utilisé (par exemple Virtualbox, tout l'environnement KDE sous Linux, etc.)
    • PyGTK : très utilisé aussi (Firefox, thunderbird, etc.)
  • numpy : Calcul numérique (matrices, etc.)
  • SciPy : Algorithmes scientifiques fondamentaux
  • matplotlib : Courbes
  • pandas : Chargement de données

Pour les tests, je réutiliserai ce que j'ai fait en première, on importe un fichier, je ne me souviens plus de son nom mais je dois l'avoir dans mes fichiers perso, et on insère dans les commentaires des lignes de test pour vérifier si tout s'est bien passé pendant l'exécution.

Pour le coup, il faut mieux faire propre tout de suite car c'est assez simple et plus simple qu'une solution à faire à la main (introductiontutoriel avancé). Les choses à comprendre :

  • On met les tests dans un dossier dédié (disons tests/)
  • On crée généralement un fichier de test par fichier python du projet (par exemple si tu as src/mon_module/ma_classe.py, tu crées tests/test_ma_classe.py). Le préfixe test_ est imposé (c'est ce qui permet à pytest de savoir qu'il doit les considérer).
  • On crée une ou plusieurs fonctions par fichier test (souvent une ou plusieurs par fonction/méthode ). Les fonctions de test doivent être préfixées par test_ (c'est ce qui permet à pytest de savoir qu'il doit les considérer)

Exemple : Crée un squelette de projet (par exemple avec poetry init) ici supposé s'appeler "foo"

src/foo/init.py

# -*- coding: utf-8 -*-

from .maths import carre, cube

src/foo/maths.py

# -*- coding: utf-8 -*-

def carre(x: double) -> double:
    """
    Calcule le carré d'un nombre.

    Args:
        x (double): Le nombre à mettre au carré.

    Exemple:
        >>> carre(3)
        ... 9

    Returns:
        La valeur, mise au carré
    """
    return x ** 2


def cube(x: double) -> double:
    """
    Calcule le cube d'un nombre.

    Args:
        x (double): Le nombre à mettre au cube.

    Exemple:
        >>> cube(2)
        ... 8

    Returns:
        La valeur, mise au cube
    """
    return x ** 3

Attention pour les docstrings :

  • Les sauts de lignes que je fais sont obligatoires, sinon sphinx fera la tête.
  • Si un texte est trop long, il faut que la nouvelle ligne soit correctement indentée, sinon sphinx fera la tête.

Tu es peut-être aussi étonné par certains double sauts de ligne. Ce sont des conventions de codage en python (norme PEP8), que tu peux contrôler par la suite avec flake8 (qui permet aussi de contrôler un minimum la cohérence du code, c'est son gros intérêt). 

def f(x, y):
    """
    Une fonction avec une description longue,
    vraiment très longue.

    Args:
        x: Un argument avec une description longue,
            vraiment très longue.
        y: Un autre argument avec une description longue,
            vraiment très longue.
    """
    print(x, y)

tests/test_maths.py

#!/usr/bin/env pytest
# -*- coding: utf-8 -*-

from foo import carre, cube


def test_carre():
    assert carre(-2) == 4
    assert carre(0) == 0
    assert carre(3) == 9


def test_cube():
    assert cube(-2) == 8
    assert carre(0) == 0
    assert carre(3) == 27

Si tu as des tests un peu compliqués, tu auras sans doute des variables déclarées dans ton test. Et si le test plante, tu auras sans doute envie de savoir ce que valaient ces variables. Dans ce cas, locals permet d'afficher les valeurs des variables locales et pformat de rendre le tout plus lisible.

from pprint import pformat
from foo import carre


def test_carre_complique():
    x = 7
    # Change 49 par une autre valeur pour voir à quoi ressemble
    # un test qui plante :)
    assert carre(x) == 49, pformat(locals())

Utilisation : dans le dossier de ton projet :

# Depuis la dossier qui contient ton projet (notamment pyproject.toml)
poetry build
pip install dist/foo*.whl
flake8
pytest

Ultime conseil, si tu n'as pas de problème en anglais, mieux vaut tout faire en anglais (nommage des classes, fonctions, documentation, etc.)

Bonne chance

2