Skip to content

PrintPages

But de l'éxercice

Le but de l'exercice est d'ecrire une fonction printpages dans un fichier printpages.py dont le but est de lister les pages à imprimer en fonction d'une selection d'un utilisateur.

Et voila le script de tests unitaires: test_printpages.py

Context

Toutes les boites de dialogue (ou presque) pour imprimer des documents contiennent un champ de selction de pages à imprimer. Il s'agit d'un champ textuel qui autorise un ou des chiffres séparés par des virgules (ou des points-virgules). On peut aussi donner une ou des plages de pages à imprimer sous la forme DEBUT-FIN.

Par exemple: 1, 2, 3, 7 imprimera les pages 1, 2 et 3, on pourra aussi ecrire cet ordre sous la forme 1-3, 7.

Exercice de base

Retourner une liste qui correspond aux pages a imprimer en fonction d'une entrée utilisateur simple: seulement les chiffres des pages à imprimer séparés par des virgules separés par un noombre non défini d'espaces que l'utilisateur pourrait rajouter (pour que ce soit plus lisible pour lui):

>>> printpages("1")
[1]
>>> printpages("1,2,3")
[1, 2, 3]
>>> printpages("1,2,3,7")
[1, 2, 3, 7]
>>> printpages("1, 2,  3, 7")
[1, 2, 3, 7]

Bonus numéro 1

Il faut maintenant rajouter le support du point-virgule comme separateur:

>>> printpages("1;2;3")
[1, 2, 3]
>>> printpages("1;2,3;7")
[1, 2, 3, 7]
>>> printpages("1; 2 , 3; 7")
[1, 2, 3, 7]

Bonus numéro 2

Ajoutons les plages de pages à imprimer. Je vous rappel qu'une plage est constituée du chiffre de depart et du chiffre d'arrivée séparés par un signe moins -.

>>> printpages("1-3")
[1, 2, 3]
>>> printpages("1-7")
[1, 2, 3, 4, 5, 6, 7]
>>> printpages("1-3;7")
[1, 2, 3, 7]

L'utilisateur étant parfois distrait, il va falloir aussi gérer les espaces dans les plages:

>>> printpages("1 -3")
[1, 2, 3]
>>> printpages("1   - 7")
[1, 2, 3, 4, 5, 6, 7]
>>> printpages("1  -  3; 7")
[1, 2, 3, 7]

Bonus numéro 3

Et si nous faisons de notre fonction un generateur?

>>> pages = printpages("1-3")
>>> list(pages)
[1, 2, 3]
>>> list(pages)
[]

Super bonus ;)

Pour ameliorer l'experience utilisateur de notre application, nous allons aussi introduire une plage: DEBUT->end. Ceci pour permetre à l'utilisateur de dire qu'il veut tout à partir de DEBUT jusqu'à la fin du document.

Pour pouvoir fonctionner, notre fonction va donc devoir prendre un nouveau parametre qui sera le nombre maximum de pages du document. Ce parametre sera optionnel et ne sera utilisé que lors de l'utilisation de plages ->end.

>>> printpages("1->end", 3)
[1, 2, 3]
>>> printpages("10->end", 13)
[10, 11, 12, 13]

Aide

Si vraiment vous êtes bloqué.e.s, vous pouvez regarder ces articles:

Solution

Voir la solution