• [^] # Re: On s'en bat le steak

    Posté par . En réponse au journal Typage statique pour Python. Évalué à 1.

    C'est même plus propre par rapport à ma solution et au problème initial : si on passe une liste dans l'appel au constructeur, on peut se retrouver au même désagrément sur les effets de bords.

    >>> class Test:
    ... def __init__(self, items=None):
    ... self.items = [] if items is None else items
    ... 
    ... def add(self, item):
    ... self.items.append(item)
    ... 
    >>> l = [1, 2, 3]
    >>> a = Test(l)
    >>> l.append(4)
    >>> a.items
    [1, 2, 3, 4]

    Là où avec ta solution, en plus d'accepter plus de type comme paramètre du constructeur, l'attribut est un peu mieux décorrélé (mais pas totalement) de l'argument.

    >>> class Test:
    ... def __init__(self, items=()):
    ... self.items = list(items)
    ... 
    >>> l = [1, [2, 3], 4]
    >>> a = Test(l)
    >>> l.append(5)
    >>> a.items
    [1, [2, 3], 4]
    >>> l[1].append(6)
    >>> a.items
    [1, [2, 3, 6], 4]
    >>>

    Je ne sais pas ce que sont les notions de propriétaires/temps de vie en Rust, mais je dirais pour ma part : comme quoi le fonctionnel pur (ou l'observationnellement immuable) ça a son intérêt ! :-)

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.