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

    Posté par (site web personnel) . En réponse au journal Typage statique pour Python. Évalué à 3.

    Dans ce cas particulier, j'aime bien aussi :

    class Test:
     def __init__(self, items=()):
     self.items = list(items)

    Défaut:
    - il y a forcément une copie, même si elle est potentiellement inutile (et du coup ça illustre bien comment, par exemple, les notions de propriétaire/temps de vie de Rust sont intéressantes pour des projets gros et devant être performants).

    Avantages:
    - puisque la liste nous appartient on peut la modifier sans trop de crainte (évidemment si les objets contenus sont mutable ils pourraient être modifiés de l'extérieur malgré ça).
    - la fonction accepte du coup n'importe quel objet itérable (comme un générateur par exemple). Dans ton code items doit posséder une méthode append().
    - même si ça ne dispense pas d'un commentaire sur l'API, la signature est plus explicite.

    Dans le cas où 'items' n'a pas vocation à être très long (et qu'on n'a pas un 2ème argument du même genre), on pourrait aussi faire:

    class Test:
     def __init__(self, *items):
     self.items = list(items)

    du coup l'appel à la fonction serait Test(1, 2, 3) plutôt que Test([1, 2, 3]).

    Comme quoi le "one way to do it" c'est (heureusement) une intention plus qu'une réalité :)