Skip to content

ASCII_Table

But de l’exercice

Le but de l’exercice est d’écrire une classe Table, dans un fichier ascii.py dont le but est de générer des tableaux ASCII de bonne facture pour les insérer dans des langages de documentation (MarkDown, AsciiDoc, Doxygen).

Et voila le script de tests unitaires : test_ascii_table.py

Context

La plupart des langages de documentation basés sur des fichiers textes permettent de faire le rendu de tableaux de manière assez simple (cliquez sur les onglets suivants pour voir soit la vue des sources soit la vue interprétée):

| Col 1 | Col 2 | Col 3 |
| ----- | ----- | ----- |
| row 1 | blah  | blah  |
| row 2 | blah  | blah  |
| row 3 | blah  | blah  |
Col 1 Col 2 Col 3
row 1 blah blah
row 2 blah blah
row 3 blah blah

Sur un exemple aussi simple, pas de soucis, mais si on prend un cas réél, la mise en page est vite perdue dés lors qu'on ajoute une ligne dont les cellules sont plus grandes que les précédentes.

Exercice de base

Ecrire une classe Table qui prenne un iterable d'iterable en parametre lors de sa construction:

>>> a = Table([["titre 1",2,3], [4,5,66666]])

Lors de la transformation en string de cet objet, nous aurons le tableau en texte avec toutes les colonnes ajustée à la taille de leur contenu, el le contenu justifié à droite:

>>> print(str(a))
| titre 1 | 2 |     3 |
| ------- | - | ----- |
|       4 | 5 | 66666 |

Lorsqu'on demandera la représentation d'un Table, il faudra qu'il retourne sa taille:

>>> print(a)
Table(rows=2, cols=3)

Il faudra aussi faire en sorte que l'on puisse appeler plusieurs fois la transformation en string:

>>> a = Table([["titre 1",2,3], [4,5,66666]])
>>> print(str(a))
| titre 1 | 2 |     3 |
| ------- | - | ----- |
|       4 | 5 | 66666 |
>>> print(str(a))
| titre 1 | 2 |     3 |
| ------- | - | ----- |
|       4 | 5 | 66666 |

Bonus numéro 1

Faire en sorte de pouvoir relire une table depuis une précédente représentation sous forme de texte:

>>> Table(str(Table([[1, 2], [3, 4]])))
'Table(rows=2, cols=2)'

Attention, la table en entrée ne sera pas forcement bien représentée:

>>> row = "| 1 | 2 |\n| --- | -- |\n|      3 | 4 |"
>>> t = Table(row)
>>> print(str(t))
| 1 | 2 |
| - | - |
| 3 | 4 |

Bonus numero 2

Pouvoir accéder à l'élément en Ième ligne et Jème colonne en lecture, soit en utilisant un tuple comme index, soit en se servant de double crochets [row][col]:

>>> a = Table([[1, 2], [3, 4]])
>>> a[(0,0)]
'1'
>>> a[1][1]
'4'

Verifier que l'on peut iterer sur les lignes de notre table grace au code ajouté:

>>> for row in Table([[1, 2], [3, 4]]):
...     print(row)
('1', '2')
('3', '4')

Ajouter l'accès en écriture sur les cellules afin de changer le contenu du tableau (seulement avec un tuple comme index):

>>> a = Table([[1, 2], [3, 4]])
>>> a[(0, 0)] = 5
>>> a[(1, 1)] = 6
>>> print(str(a))
| 5 | 2 |
| - | - |
| 3 | 6 |

Bonus numéro 3

Rendre possible: * d'ajouter une nouvelle ligne: * soit à la place que l'on veut: insert_row * soit en ajout à la fin du tableau: append_row * de supprimer une ligne en retournant son contenu: * en donnant son index: pop_col(index) * pour supprimer la derniere: pop() * d'ajouter une nouvelle colonne: * soit à la place que l'on veut: insert_col * soit en ajout à la fin du tableau: append_col * de supprimer une colonne en retournant son contenu: * en donnant son index: pop_col(index) * pour supprimer la derniere: pop()

>>> a = Table([[1, 2], [3, 4]])
>>> repr(a)
'Table(rows=2, cols=2)'
>>> a.append_row((5, 6))
>>> repr(a)
'Table(rows=3, cols=2)'
>>> a.append_col((7, 8, 9))
>>> print(str(a))
| 1 | 2 | 7 |
| - | - | - |
| 3 | 4 | 8 |
| 5 | 6 | 9 |
>>> a.pop_row()
['5', '6', '9']
>>> a.pop_col(1)
['2', '4']
>>> print(str(a))
| 1 | 7 |
| - | - |
| 3 | 8 |

Ne pas oublier que lorsqu'on ajoute quelque chose qui n'a pas la bonne taille il faudra lever une exception de type ValueError.

>>> a = Table([[1, 2], [3, 4]])
>>> a.append_row((5, 6, 7))
Exception raised:
ValueError: input row is not of the right size 3 (should be 2)

Aide

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

Solution

Voir la solution