Attention ! Cet interpréteur n’est pas totalement compatible avec Python3.
class Tableau(dict):
"""Émulation d’un tableau de longueur n.
Ne pas oublier en tête de fichier:
from tableaux import Tableau
>>> mon_tab = Tableau(0) # Création impossible avec taille nulle
Traceback (most recent call last):
...
ValueError: Size should be a positive integer
>>> mon_tab = Tableau(-1) # Création impossible avec taille négative
Traceback (most recent call last):
...
ValueError: Size should be a positive integer
>>> mon_tab = Tableau(3) # Création
>>> print(mon_tab) # Affichage
{0: None, 1: None, 2: None}
>>> print(len(mon_tab)) # Longueur
3
>>> print(mon_tab[0]) # Élément non initialisé
None
>>> mon_tab[0] = 0 # Initialisation
>>> print(mon_tab[0]) # Élément initialisé
0
>>> mon_tab["bla"] # Index non entier en lecture
Traceback (most recent call last):
...
TypeError: Not an integer (got bla, <class 'str'>)
>>> mon_tab[3] # Index non existant en lecture
Traceback (most recent call last):
...
IndexError: 3
>>> mon_tab["bla"] = 0 # Index non entier en écriture
Traceback (most recent call last):
...
TypeError: Not an integer (got bla, <class 'str'>)
>>> mon_tab[3] = 0 # Index non existant en écriture
Traceback (most recent call last):
...
IndexError: 3
>>> mon_tab[0] = 0.0 # Mauvais type
Traceback (most recent call last):
...
TypeError: Bad type: <class 'float'> instead of <class 'int'>.
>>> mon_tab2 = Tableau(3, int) # Création avec précision du type
>>> mon_tab2[0] = 0.0 # Mauvais type
Traceback (most recent call last):
...
TypeError: Bad type: <class 'float'> instead of <class 'int'>.
>>> mon_tab3 = Tableau(2) # Tableau de tableaux
>>> print(mon_tab3)
{0: None, 1: None}
>>> mon_tab3[0] = Tableau(3)
>>> mon_tab3[1] = Tableau(3)
>>> for i in range(2):
... for j in range(3):
... mon_tab3[i][j] = str(i) + ',' + str(j)
>>> print(mon_tab3)
0,0 1,0
0,1 1,1
0,2 1,2
>>> mon_tab3
0,0 1,0
0,1 1,1
0,2 1,2
>>> mon_tab4 = Tableau(2) # Test initialisation partielle
>>> mon_tab4[0] = Tableau(3)
>>> print(mon_tab4)
Traceback (most recent call last):
...
TypeError: A sub-Tableau is not a Tableau.
TODO: override max
"""
def __init__(self, length, type_of_elts=None):
if length <= 0:
raise ValueError("Size should be a positive integer")
self.set = False
self.type_of_elts = type_of_elts
for i in range(length):
self[i] = None
self.set = True
def __getitem__(self, k):
if type(k) != type(0):
raise TypeError("Not an integer (got %s, %s)" % (k, type(k)))
if self.set and k not in range(len(self)):
raise IndexError(k)
return super(Tableau, self).__getitem__(k)
def __setitem__(self, k, v):
if type(k) != type(0):
raise TypeError("Not an integer (got %s, %s)" % (k, type(k)))
if self.set and k not in range(len(self)):
raise IndexError(k)
elif self.set and \
self.type_of_elts is not None and \
type(v) != self.type_of_elts:
tpl = "Bad type: %s instead of %s."
raise TypeError(tpl % (type(v), self.type_of_elts))
else:
if self.type_of_elts is None and v is not None:
self.type_of_elts = type(v)
super(Tableau, self).__setitem__(k, v)
def __repr__(self):
if not len(self):
return '{}'
if type(self[0]) is Tableau:
for subtable in self.values():
if type(subtable) is not Tableau:
raise TypeError("A sub-Tableau is not a Tableau.")
# taille max de chaque colonne
widths = [max([len(str(elt)) for elt in self[i].values()]) for i in range(len(self))]
# construction des lignes
lines = []
for j in range(len(self[0])):
elts = [str(self[i][j]).ljust(widths[i]) for i in range(len(self))]
lines.append(' '.join(elts))
return '\n'.join(lines)
else:
return super(Tableau, self).__repr__()
def __str__(self):
return self.__repr__()
import doctest
doctest.testmod()