Aller au contenu

Guide de l'IDE⚓︎

Exemple⚓︎

Un IDE se présente sous cette forme :

Enroulez-moi !

###
assert somme([]) == None, "Test 1 failed"bksl-nlassert somme([1, 2]) == 3, "Test 2 failed"bksl-nlbksl-nl ∞/∞
# --HDR--#bksl-nldef mystere(a: int) -> int:bksl-nl return abksl-nlbksl-nlbksl-nl# --HDR--#bksl-nlbksl-nlbksl-nldef sommation(T: list) -> int:bksl-nl a = 0bksl-nl for nombre in T:bksl-nl a = a + nombrebksl-nl return abksl-nlbksl-nlbksl-nldef somme(L: list) -> None | int:bksl-nl return None if len(L) == 0 else sum(L)bksl-nlbksl-nldef somme(L: list[int]) -> int:bksl-nl return None if len(L) == 0 else sum(L)bksl-nlbksl-nl

A

Remarque sur la solution

C'est simple mais il faut être vigilant.

Une autre remarque est possible

Toujours simple mais toujours vigilant.

Z

Il dispose de six boutons :

  • Lancer le script :
  • Valider le script avec des tests unitaires :
  • Télécharger le script actuel :
  • Téléverser un script local :
  • Recharger l'énoncé :
  • Enregistrer le script actuel :
Rappel RGPD

Tout se fait du côté client. Rien n'est envoyé au serveur.

Prise en main⚓︎

Par défaut, la commande {{IDE('exo2')}} permet de charger un script placé dans docs/scripts/.

Organisations possibles

Votre page markdown constitue un chapitre et regroupe de nombreux exercices avec de nombreux IDE.

Dans ce cas, optez pour l'arborescence suivante :

docs/
├── images
│   └── projet2
│       └── plante.png
├── index.md
├── projet1.md
├── projet2.md     ⬅︎ corps du chapitre que vous souhaitez écrire
├── projet3.md
├── scripts
│   ├── projet2    ⬅︎ dossier contenant les exercices à intégrer à vos IDE
│      ├── exo1.py
│      ├── exo1_corr.py
│      ├── exo1_test.py
│      ├── exo2.py
│      ├── exo2_corr.py
│      ├── exo2_test.py
│      ├── exo3.py
│      ├── exo3_corr.py
│      ├── exo3_test.py
│      ├── exo4.py
│      ├── exo4_corr.py
│      ├── exo4_test.py
│      ├── exo5.py
│      ├── exo5_corr.py
│      ├── plante_fractale.py
│      └── tableau_dynamique.py
......

Exemple :

{{IDE('projet2/exo2')}} chargera le script exo2.py depuis docs/scripts/projet2/.

Votre page markdown est spécialisée sur un exercice particulier, indiqué dans mkdocs.yml.

Dans ce cas, optez pour l'arborescence ci-dessous :

docs/
├── N1
│   ├── 110-maximum_nombres
│      ├── exo.py
│      ├── exo_corr.py
│      ├── exo_test.py
│      └── sujet.md

Exemple :

  • mkdocs.yml contient la ligne - "Calcul de max": N1/110-maximum_nombres/sujet.md.
  • {{IDE('exo')}} chargera le script exo.py depuis docs/N1/110-maximum_nombres/.

Format de fichiers

Le script Python est écrit de manière classique avec quelques particularités.

Il peut se décomposer en ces éléments (tous facultatifs) :

#MAX Nombre_d_essais_autorisés
#--- HDR ---#
"""
Code Python dans un header
Ce code ne sera pas visible par l'élève et sera exécuté avant le code élève à l'exécution et à la validation

Utile pour proposer des classes spécifiques à un exercice
"""
#--- HDR ---#

"""
Code élève à compléter
"""

#Tests
"""
Tests publics faits à l'exécution et à la validation
Exemple: assert machin == 0, "vous avez une erreur de machin"
"""

Les librairies standards sont pour la plupart acceptées, les limitations étant principalement graphiques. Les annotations de type, le walrus opérator sont acceptées.

Le fichier Python de correction s'appelle nom_de_script_corr.py.

Vous pouvez répéter le HDR si vous le souhaitez afin que l'élève puisse tester en local

1
2
def somme(L: list[int]) -> int:
    return None if len(L) == 0 else sum(L)

Le fichier de juge en ligne peut être écrit de manière beaucoup plus "classique" en utilisant assert :

1
2
3
assert longueur_ajout([], []) == 0, 'longueur_ajout([], []) == 0'
assert longueur_ajout([1, 3, 5, 5],[]) == 4, 'longueur_ajout([1, 3, 5, 5],[]) == 4'
assert longueur_ajout([0]*100, [1]*20) == 120, 'longueur_ajout([0]*100, [1]*20) == 120'

Les assert sont directement évalués par Pyodide. Seul le test ayant échoué sera affiché. Les tests réussis n'afficheront rien.

Pas de problème pour tester autant de fonctions que nécessaire.

Le fichier de juge en ligne doit contenir une variable appelée benchmark, de type list ou tuple :

1) Si l'on souhaite vérifier une unique fonction grâce à l'évaluateur de code :

1
benchmark = ['longueur([])==0', 'longueur([1,3,5,5])==4', 'longueur([0]*100)==100']

On a donc un tuple de chaînes de caractères qui sera évalué avec eval().

2) Si l'on souhaite vérifier plusieurs fonctions grâce à l'évaluateur de code :

1
2
assert somme([]) == None, "Test 1 failed"
assert somme([1, 2]) == 3, "Test 2 failed"

On a donc un tuple de tableau de chaînes de caractères qui sera évalué avec eval().

Options

Lors de l'appel à un IDE dans le fichier .md, il est possible de spécifier plusieurs options telles :

{{IDE("fichier1.py", MAX = 5, SANS = "sort, exec", SIZE = 14)}}

ou

{{IDE("fichier2.py", MAX = "+")}}

  • MAX : indique le nombre maximum d'essais autorisés pour résoudre un exercice avant révélation de la solution (1000 ou "+" pour infini). Par défaut : 5.
  • SANS : exclu des instructions Python (builtins ou non). Par défaut : "exec, eval".
  • SIZE : donne la taille maximale d'un IDE. Si le script est plus petit, la taille réelle s'adaptera au plus petit. Un script Python plus long que SIZE sera tout de même visible à l'aide des sliders. Par défaut : 20.

Important

Le bouton de validation du script à l'aide de tests unitaires est présent uniquement si vous fournissez un fichier nom_du_fichier_test.py présent dans le même répertoire que nom_du_fichier.py.

La solution apparait au bout du nombre de tests unitaires définis dans le fichier ou directement dans la création de l'IDE seulement si vous fournissez un fichier nom_du_fichier_corr.pydans le même répertoire que nom_du_fichier.py.

Les boutons de lancement du script, de téléchargement, de téléversement, de sauvegarde et de rechargement sont présents par défaut.

Conclusion

À condition que les fichiers fichier.py, fichier_corr.py et fichier_test.py soient présents, {{IDE('foo/bar/truc/muche/fichier')}} gère tout seul :

  • l'énoncé,
  • le juge en ligne,
  • les fichiers de correction