tite fractale

tableaux.py

télécharger

Attention ! Cet interpréteur n’est pas totalement compatible avec Python3.

Theme:

 

Version inerte :

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()









Page générée le 27/05/2021, 09h53'27" (page virtuelle).
historique global