L’ordre des choses


Des mois et des mois que je n’ai pas écrit :) Je ne compte même pas Max, qui à l’heure où je vous parle est en train découvrir les joies de la sidérurgie et qui ne se souvient du blog que quand on en parle dans le jacuzzi d’un FKK.

Ça va faire 4 ans qu’on a ce truc.

Entre temps lui et moi avons déménagé plusieurs fois, séparément, puis réaménagé ensemble, on a pris des responsabilités comme l’achat d’une machine à glaçons et la culture de plantes carnivores (la mienne est morte, mais il a la main verte apparemment).

Je vais être franc avec vous, l’écriture ne m’a pas manqué. Pas du tout.

Et puis aujourd’hui, j’ai eu envie. Ça ne m’avait pas pris depuis pas mal de temps, mais c’est une bonne chose : le sens du devoir avait depuis longtemps perdu son influence sur ma motivation éditoriale.

Est-ce que ça va durer un article ? 10 ? Un an ?

On va voir.

Mais ce ne sont pas les sujets qui manquent. En fait Python 3.6 est droit devant nous, avec plein de trucs chouettes à la clé. J’ai aussi beaucoup joué avec asyncio, jusqu’à trouver des bugs dedans et les reporter aux core-dev direct.

Pour le cul par contre, je ne sais pas encore, je vais laisser traîner jusqu’à ce que, tel Rocco dans Omar et Fred, ma bite me parle.

Python pour commencer donc.

Plein de changements de perfs, en vitesse, occupation mémoire, etc, prévus pour la prochaine version. Parmi eux, un changement majeur sur l’implémentation des dictionnaires inspiré directement de Pypy, qui les rendront plus compacts et plus rapides.

Et surtout, ordonnés par défaut.

Yep, plus besoin de collections.OrderedDict, qui restera malgré tout pour des raisons de compatibilité.

Enfin s’ils décident que ça fait maintenant partie de la specs et n’est pas juste un détail d’implémentation.

Ca veut dire aussi que **kwargs et __dict__ deviendront ordonnés, ce qui va arranger beaucoup de monde.

Mais l’article, en plus de prêcher la bonne nouvelle, est aussi là pour vous parler d’un petit hack sympa qui peut être pratique dans votre PYTHONSTARTUP pour des sessions shellifiantes : donner l’impression d’avoir un OrderedDict builtin par défaut.

from textwrap import dedent
from collections import OrderedDict
 
class OrderedDictFactory(object):
 
    # __getitem__ est la méthode magique appelée quand on fait objet[trucs]
    # et keys contient la liste des trucs
    def __getitem__(self, keys):
 
        for key in keys:
 
            # slice est un objet builtin fabriqué par Python quand on fait 
            # objet[debut:fin], qui contient le debut et la fin
            if not isinstance(key, slice):
 
                # on check qu’on a bien une liste de slices
                raise SyntaxError(dedent("""
                    One element of the dict is not a key/value pair: {!r}.
 
                    The syntax is d["key1": "value", "key2": "value", ...].
                    Check if you haven't missed a semicolon somewhere.
                """.format(key)))
 
        # et on retourne juste un ordered dict classique
        return OrderedDict([(k.start, k.stop) for k in keys])
 
# instance de référence pour notre factory abrégé pour des raisons de 
# facilité
d = OrderedDictFactory()

Et hop, on abuse la notation du slicing :

>>> menu = d[
   "Samurai pizza cats" : "fruits de mer", # un slice
   "Tortue ninja" : "4 saisons", # un autre slice 
   'Max': "paysanne" # do you wanna slice ?
]
 
>>> menu
OrderedDict([('Samurai pizza cats', 'fruits de mer'), ('Tortues ninjsa', '4 saisons'), ('Max', 'paysanne')])

Rien à voir avec la choucroute, mais certaines personnes m’ont parlé de faire un miroir SFW du blog. Je vous rappelle que le blog est sous creative common, alors faites-vous plaiz, vous pouvez tout réutiliser.

21 thoughts on “L’ordre des choses

  • floweb

    Concernant les “nouveaux” dict, ça veut dire qu’on pourra ENFIN faire ça ?

    a = {"toto": "Hello world!"}

    print(a.toto)

    Hello world!

    Ou j’ai rien compris ?

  • Sam Post author

    Non ça n’arrivera jamais, les instances de classes et les objets resteront toujours bien distincts pour des raisons de lisibilité. Il est important de pouvoir savoir d’un coup d’oeil à quoi on accède, sinon c’est l’anarchie, sacrifices humains, chiens et chats couchant ensemble, hystérie collective !

  • floweb

    C’est bien ce qui me semblait aussi, ça me parraissait trop beau…

    Cela dit rien que le fait qu’ils soient ordonnés par défaut est kiffant.

    Merci pour la clarification !

  • Nairwolf

    J’ai peut être rien compris, mais tant pis, je prends la peine de poser la question bête.

    Il n’ y a pas un problème de cohérence entre ce que tu écris

    >>>menu = d[

    "Samurai pizza cats" : "fruits de Mer", # un slice

    "Tortue ninja" : "4 saisons", # un autre slice

    'Max': "paysanne" # do you wanna slice ?

    ]

    et le résultat de la variable menu :

    >>>menu

    OrderedDict([('Schtroumpf', 'salsepareille'), ('Tortue ninja', 'pizza'), ('Max', 'pastis')])

    ?

    En tout cas, je suis content de te revoir Sam !

  • Tienslebien

    C’est cool de vous retrouver.

    Vivement un prochain article !

  • floweb

    @Xavier Combelle: j’ai déjà eu a faire à du code qui utilisait Munch pour y arriver, et c’est appréciable au demeurant !

    Beaucoup plus noob-friendly également car souvent ils ont déjà fait du JS, et ça rentre plus vite dans leur petite tête:

    https://github.com/Infinidat/munch

  • felko

    Faudrait aussi checker au cas où si il y a un argument step dans la notation slice. En soi ça pose pas de problème au fonctionnement mais ça serait juste bizarre de voir ça:

    menu = d[
        "schtroumpf": "salsepareille" : "azraël",
        "tortues ninja": "pizza"
    ]
    
  • Yinameah

    Sympa de voir un nouvel article.

    Je fais un peu de programmation python pour le plaisir. J’ai découvert ce blog il y a quelques temps déjà. J’y viens assez souvent, j’aime le ton et l’efficacité des explications.

    Je dois dire que c’est devenu pour moi une de ces rares sources fiable et de référence dans mon petit univers web. Si j’ai un soucis en programmation ou même en informatique en général, ce blog est souvent en bon point de départ.

    Donc voilà, c’est juste pour dire bravo… et merci !

  • trenzalore

    Bah php7 est super rapide et semble bien plus apprécié que python de nos jours.

    Je n’ai plus vu de jobs web ou scientifiques pour python depuis belle lurette.

    Pour du freelance, pourquoi pas, mais en entreprises rien n’égale php, c#/asp, java si vous voulez décrocher un job et c’est bien dommage.

  • buffalo974

    Les sourcils en circonflexes, un sourrire béat : la bonne surprise de revoir S&M !

  • YCL1

    J’ai débuté Python il y a trois ans et évolué pour une bonne partie grâce à votre site, grâce à votre investissement dans vos articles et votre suivis dans les commentaires.

    Je pense qu’on a tous à un moment l’envie de transmettre, de donner l’envie d’aimer apprendre, s’enrichir, professionnellement ou non. Ça peut se traduire par la création d’un blog/site, ou simplement la passion de répondre à une colle sur un forum. Ça nous apporte une satisfaction de réussir à résoudre un problème mais aussi ça nous permet de s’améliorer et s’enrichir, c’est mon cas.

    Que vous finissiez par en avoir marre ça se comprend tout à fait, et personne ne vous le reprochera.

    Je lance une idée comme ça, libre à vous de m’envoyer chier.

    Si vous vouliez accomplir votre travail de ce site et qu’il perdure, ce serait de permettre à la communauté qui vous ont suivi, et qui se sont formés grâce à vous, de leur permettre de publier/apporter leur participation, par exemple sous la forme d’un wiki. À commencé par la traduction des articles py2to3.

    Je sais qu’il existe de nombreux sites dédiés à la programmation et qui permettent de publier des articles, mais celui-ci serait dédié à Python.

    Et Python a beau être un langage très documenté (en tout cas sur les stdlib), il a beaucoup d’astuces et exemples que je n’ai trouvé que sur votre site.

    Salutations,

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.