Partage
  • Partager sur Facebook
  • Partager sur Twitter

dictionnaires et duck-typing.

    13 septembre 2020 à 17:02:55

    Bonjour,

    il y a un truc que je viens de remarquer et qui me parait totalement illogique en python.

    Python est un langage qui est censé être basé sur le duck-typing. Exemple sur l'itération:

    def my_beautiful_function(my_list=list()):
        for value in my_list:
            print(value)
    

    ici, j'ai une fonction qui attends une liste. Mais en fait, du moment que le paramètre a une méthode __iter__, ça fonctionne. Donc ça fonctionne si on envoi une liste, mais aussi un tuple, un set, un objet custom, un dictio… euh nan pas un dictionnaire !??

    Enfin ça va itérer, mais les dictionnaires par défaut ne renvoie pas les valeurs, mais les clés lorsque l'on itère dessus, alors que tous les autres itérables renvoient leurs valeurs. Donc impossible de passer un dictionnaire à ma fonction ici. Ça va faire des trucs bizarres.

    Du coup, je ne comprends pas le choix qui a été fait de renvoyer les clés lorsque l'on itère sur un dictionnaire.

    -
    Edité par Megalo 13 septembre 2020 à 17:12:01

    • Partager sur Facebook
    • Partager sur Twitter
      13 septembre 2020 à 18:44:38

      Bonjour,

      Il y a plusieurs manières d'itérer sur un dictionnaire, y compris pour accéder à ses valeurs (items, values, ...).

      Malheureusement ce choix ne t'arrange pas, mais ce principe a connu des débats et amener à une décision de la part d'un groupe de travail.

      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        13 septembre 2020 à 18:49:03

        Megalo a écrit:

        Bonjour,

        il y a un truc que je viens de remarquer et qui me parait totalement illogique en python.

        Python est un langage qui est censé être basé sur le duck-typing. Exemple sur l'itération:

        def my_beautiful_function(my_list=list()): for value in my_list: print(value) 

        ici, j'ai une fonction qui attends une liste. Mais en fait, du moment que le paramètre a une méthode __iter__, ça fonctionne. Donc ça fonctionne si on envoi une liste, mais aussi un tuple, un set, un objet custom, un dictio… euh nan pas un dictionnaire !??

        Enfin ça va itérer, mais les dictionnaires par défaut ne renvoie pas les valeurs, mais les clés lorsque l'on itère dessus, alors que tous les autres itérables renvoient leurs valeurs. Donc impossible de passer un dictionnaire à ma fonction ici. Ça va faire des trucs bizarres.

        Du coup, je ne comprends pas le choix qui a été fait de renvoyer les clés lorsque l'on itère sur un dictionnaire.

        -
        Edité par Megalo il y a environ 1 heure

        Oui, mais ça serait relativement idiot de renvoyer par défaut les indices pour les autres (set, tuples, listes, etc.) sachant que l'index des valeurs n'a a priori aucun intérêt. Par exemple, dans un set, l'indice n'a aucun intérêt, le seul intérêt des set est de ne pas avoir deux fois le même éléments. Ce n'est pas le cas des dictionnaires pour lesquels les valeurs ne sont atteignables que grâce à une clef particulière et pour lesquels les clefs sont uniques.

        • Partager sur Facebook
        • Partager sur Twitter
          13 septembre 2020 à 20:00:47

          > Il y a plusieurs manières d'itérer sur un dictionnaire, y compris pour accéder à ses valeurs (items, values, ...).

          oui, je connais ça. Mais du coup on perd le duck-typing (list n'as pas de méthode values, enumerate ne fonctionne pas sur les dico, etc. Donc obligé de se débrouiller à coup de try ou de if).

          > Oui, mais ça serait relativement idiot de renvoyer par défaut les indices pour les autres (set, tuples, listes, etc.) sachant que l'index des valeurs n'a a priori aucun intérêt. Par exemple, dans un set, l'indice n'a aucun intérêt, le seul intérêt des set est de ne pas avoir deux fois le même éléments.

          Je suis parfaitement d'accords là dessus. C'est plutôt le choix sur les dictionnaires que je trouves surprenant. Quand on itère, c'est quand même beaucoup plus fréquent de devoir accéder au valeurs qu'aux clés il me semble.

          -
          Edité par Megalo 13 septembre 2020 à 20:01:11

          • Partager sur Facebook
          • Partager sur Twitter
            14 septembre 2020 à 7:46:26

            Dans une liste, l'indice a peu d'importance.
            Si je retiens l'indice d'une valeur et que j'insère une autre valeur avant, l'indice ne pointera plus vers la même valeur.
            Dans un dictionnaire, on ne peut pas parler d'insertion et la clé est aussi importante que la valeur.
            Et ce, même si je peux retrouver deux fois la même valeur, aussi bien dans une liste que dans un dictionnaire.
            Le dictionnaire se compare un peu à un set dans le sens que la clé est unique (la valeur dans un set).
            Tout ça pour dire que le dictionnaire est une bête un peu spéciale.

            -
            Edité par PierrotLeFou 14 septembre 2020 à 7:48:57

            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

              17 septembre 2020 à 8:10:02

              Nephthys a écrit: > Oui, mais ça serait relativement idiot de renvoyer par défaut les indices pour les autres (set, tuples, listes, etc.) sachant que l'index des valeurs n'a a priori aucun intérêt. Par exemple, dans un set, l'indice n'a aucun intérêt, le seul intérêt des set est de ne pas avoir deux fois le même éléments. Ce n'est pas le cas des dictionnaires pour lesquels les valeurs ne sont atteignables que grâce à une clef particulière et pour lesquels les clefs sont uniques.

              Dans un set, les indices n'existent même pas, les sets ne sont pas subscriptables.

              @Megalo, justement, en appelant la méthode values tu récupérerais une vue sur les valeurs de ton dictionnaire, vue que tu peux parfaitement passer à ta fonction.

              my_beautiful_function({'abc': '123, 'def': 456}.values())
              

              (par ailleurs, attention dans ton exemple avec les paramètres par défaut qui sont des mutables, ça peut avoir des effets indésirés)

              • Partager sur Facebook
              • Partager sur Twitter

              dictionnaires et duck-typing.

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown