{"id":299,"date":"2009-12-20T23:57:46","date_gmt":"2009-12-20T22:57:46","guid":{"rendered":"http:\/\/j-mad.com\/blog\/?p=299"},"modified":"2010-01-14T12:55:31","modified_gmt":"2010-01-14T11:55:31","slug":"django-dicts-rivers-toi-aussi-devient-fan","status":"publish","type":"post","link":"https:\/\/j-mad.com\/blog\/2009\/12\/20\/django-dicts-rivers-toi-aussi-devient-fan\/","title":{"rendered":"Django : Dict&#8217;s Rivers, toi aussi devient fan."},"content":{"rendered":"<p>C&#8217;est <a title=\"benoitc\" href=\"http:\/\/twitter.com\/benoitc\">benoitc<\/a> qui en me parlant des dicts fournis par Django m&#8217;a fait d\u00e9couvrir les quelques classes bien utiles d\u00e9finis dans <a href=\"http:\/\/code.djangoproject.com\/browser\/django\/trunk\/django\/utils\/datastructures.py\">datastructures.py <\/a>du module utils de django.<\/p>\n<p>Ce sont donc, comme le titre de ce petit billet (plus m\u00e9mo que billet) l&#8217;explicite bien des dicts.<\/p>\n<h1>1- Le MergeDict<\/h1>\n<p>On le construit en lui donnant plusieurs dict. Il en fait une esp\u00e8ce de gros dict virtuel qui contient tout les dicts. Si on tente une op\u00e9ration sur une cl\u00e9 (un has_key, un get ou un __get_item__ ) il la cherchera\u00a0 dans tout les dicts. Par contre si elle est pr\u00e9sente dans plusieurs dict, il utilisera la premi\u00e8re occurrence qu&#8217;il trouve (pour le get par exemple).<\/p>\n<p>Un dict qui peut \u00eatre utile, surement.<\/p>\n<h1>2- Le MultiValueDict<\/h1>\n<p>L\u00e0 encore, le nom parle de lui-m\u00eame. C&#8217;est donc un dict qui permet d&#8217;avoir non pas une seule valeur, mais une liste de valeur par cl\u00e9. En plus des fonctions classiques des dicts, elle offre donc getlist, setlist, setlistdefault et appendlist pour pouvoir interagir avec les instances de la classe.<\/p>\n<h1>3- Le DotExpandedDict<\/h1>\n<p>Ce Dict est un peu un OVNI. En fait la classe se contente de red\u00e9finir un constructeur qui va vous permettre de construire des dicts qui contiennent eux m\u00eames des dicts et celant en passant en param\u00e8tres des cha\u00eenes de caract\u00e8res construite d&#8217;une mani\u00e8re pr\u00e9cise (en utilisant des .)<\/p>\n<p>Un exemple (celui donn\u00e9 dans le code) sera surement plus parlant.<\/p>\n<div class=\"codecolorer-container python default\" style=\"overflow:auto;white-space:nowrap;width:435px;\"><div class=\"python codecolorer\"><span class=\"sy0\">&gt;&gt;&gt;<\/span> d <span class=\"sy0\">=<\/span> DotExpandedDict<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><span class=\"st0\">'person.1.firstname'<\/span>: <span class=\"br0\">&#91;<\/span><span class=\"st0\">'Simon'<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> \\<br \/>\n<span class=\"st0\">'person.1.lastname'<\/span>: <span class=\"br0\">&#91;<\/span><span class=\"st0\">'Willison'<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> \\<br \/>\n<span class=\"st0\">'person.2.firstname'<\/span>: <span class=\"br0\">&#91;<\/span><span class=\"st0\">'Adrian'<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> \\<br \/>\n<span class=\"st0\">'person.2.lastname'<\/span>: <span class=\"br0\">&#91;<\/span><span class=\"st0\">'Holovaty'<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"sy0\">&gt;&gt;&gt;<\/span> d<br \/>\n<span class=\"br0\">&#123;<\/span><span class=\"st0\">'person'<\/span>: <span class=\"br0\">&#123;<\/span><span class=\"st0\">'1'<\/span>: <span class=\"br0\">&#123;<\/span><span class=\"st0\">'lastname'<\/span>: <span class=\"br0\">&#91;<\/span><span class=\"st0\">'Willison'<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'firstname'<\/span>: <span class=\"br0\">&#91;<\/span><span class=\"st0\">'Simon'<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'2'<\/span>: <span class=\"br0\">&#123;<\/span><span class=\"st0\">'lastname'<\/span>:<span class=\"br0\">&#91;<\/span><span class=\"st0\">'Holovaty'<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'firstname'<\/span>: <span class=\"br0\">&#91;<\/span><span class=\"st0\">'Adrian'<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#125;<\/span><span class=\"br0\">&#125;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"sy0\">&gt;&gt;&gt;<\/span> d<span class=\"br0\">&#91;<\/span><span class=\"st0\">'person'<\/span><span class=\"br0\">&#93;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><span class=\"st0\">'1'<\/span>: <span class=\"br0\">&#123;<\/span><span class=\"st0\">'lastname'<\/span>: <span class=\"br0\">&#91;<\/span><span class=\"st0\">'Willison'<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'firstname'<\/span>: <span class=\"br0\">&#91;<\/span><span class=\"st0\">'Simon'<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'2'<\/span>: <span class=\"br0\">&#123;<\/span><span class=\"st0\">'lastname'<\/span>: <span class=\"br0\">&#91;<\/span><span class=\"st0\">'Holovaty'<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'firstname'<\/span>: <span class=\"br0\">&#91;<\/span><span class=\"st0\">'Adrian'<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#125;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"sy0\">&gt;&gt;&gt;<\/span> d<span class=\"br0\">&#91;<\/span><span class=\"st0\">'person'<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">'1'<\/span><span class=\"br0\">&#93;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><span class=\"st0\">'lastname'<\/span>: <span class=\"br0\">&#91;<\/span><span class=\"st0\">'Willison'<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'firstname'<\/span>: <span class=\"br0\">&#91;<\/span><span class=\"st0\">'Simon'<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#125;<\/span><\/div><\/div>\n<h1>4- Le SortedDict<\/h1>\n<p>C&#8217;est mon pr\u00e9f\u00e9r\u00e9, tout simplement parce que j&#8217;ai d\u00e9j\u00e0 du l&#8217;utiliser et qu&#8217;il m&#8217;a permis de ne pas avoir \u00e0 le recoder moi-m\u00eame. Il se contente de garder l&#8217;ordre dans lequel on ins\u00e8re des choses dedans. Pour \u00eatre clair, lorsque l&#8217;on it\u00e8re dessus, il va utiliser l&#8217;ordre d&#8217;insertion des donn\u00e9es. Et \u00e7a, c&#8217;est vraiment cool.<\/p>\n<h1>5- Le reste<\/h1>\n<p>il reste encore deux classes dans ce sympathique petit fichier.<\/p>\n<p>Une ImmutableList, qui fonctionne comme un tuple et qui est compl\u00e9tement imutable (et l&#8217;on peut m\u00eame choisir le message d&#8217;erreur qu&#8217;il vous envoie \u00e0 la figure pour vous le dire qu&#8217;il est immutable.<\/p>\n<p>Un DictWrapper qui permet de s&#8217;assurer que les valeurs contenues dans le dict seront pass\u00e9es \u00e0 travers une fonction avant d&#8217;\u00eatre donn\u00e9 \u00e0 l&#8217;utilisateur, si la cl\u00e9 en rapport commence par un pr\u00e9fix donn\u00e9.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>C&#8217;est benoitc qui en me parlant des dicts fournis par Django m&#8217;a fait d\u00e9couvrir les quelques classes bien utiles d\u00e9finis dans datastructures.py du module utils de django. Ce sont donc, comme le titre de ce petit billet (plus m\u00e9mo que billet) l&#8217;explicite bien des dicts. 1- Le MergeDict On le construit en lui donnant plusieurs &hellip; <a href=\"https:\/\/j-mad.com\/blog\/2009\/12\/20\/django-dicts-rivers-toi-aussi-devient-fan\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Django : Dict&#8217;s Rivers, toi aussi devient fan.<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[6],"tags":[99,98],"class_list":["post-299","post","type-post","status-publish","format-standard","hentry","category-django","tag-django","tag-python"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p12cdp-4P","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/299","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/comments?post=299"}],"version-history":[{"count":3,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/299\/revisions"}],"predecessor-version":[{"id":391,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/299\/revisions\/391"}],"wp:attachment":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/media?parent=299"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/categories?post=299"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/tags?post=299"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}