{"id":1058,"date":"2014-12-18T19:04:12","date_gmt":"2014-12-18T17:04:12","guid":{"rendered":"http:\/\/saladtomatonion.com\/blog\/?p=1058"},"modified":"2014-12-18T19:33:35","modified_gmt":"2014-12-18T17:33:35","slug":"une-utilisation-etonnante-du-mot-cle-or-en-python","status":"publish","type":"post","link":"https:\/\/saladtomatonion.com\/blog\/2014\/12\/18\/une-utilisation-etonnante-du-mot-cle-or-en-python\/","title":{"rendered":"Une utilisation \u00e9tonnante du mot-cl\u00e9 \u00ab\u00a0or\u00a0\u00bb en python"},"content":{"rendered":"<p>Aujourd&rsquo;hui, on \u00e9crit du code compact. Savez-vous qu&rsquo;il est possible d&rsquo;utiliser le mot cl\u00e9 python <code>or<\/code> pour une affectation de valeur conditionnelle simple et \u00e9l\u00e9gante?<\/p>\n<p>Lorsque l&rsquo;on souhaite affecter conditionnellement des valeurs, on aura tendance \u00e0 utiliser des structures <code>if<\/code>. Ici on va s&rsquo;int\u00e9resser au cas o\u00f9 la valeur re\u00e7ue est <code>None<\/code>, qu&rsquo;on souhaite dans ce cas remplacer par une valeur par d\u00e9faut autre.<\/p>\n<pre name=\"code\" class=\"py:nogutter:nocontrols\">\r\nval = get_some_value()\r\nif val is None:\r\n   val = 'default'\r\nsome_function(val)\r\n<\/pre>\n<p>Mais cela pourrait s&rsquo;\u00e9crire bien plus simplement de la fa\u00e7on suivante:<\/p>\n<pre name=\"code\" class=\"py:nogutter:nocontrols\">\r\nval = get_some_value()\r\nsome_function(val or 'default')\r\n<\/pre>\n<p>Par quel miracle? Simplement, lorsqu&rsquo;on utilise l&rsquo;op\u00e9ration bool\u00e9ene <code>or<\/code>, python \u00e9value la fonction <code>__nonzero__<\/code> (ou bien <code>__bool__<\/code> en Python 3) de l&rsquo;object \u00ab\u00a0de gauche\u00a0\u00bb. Si cette \u00e9valuation retourne <code>False<\/code>, l&rsquo;objet de \u00ab\u00a0droite\u00a0\u00bb est choisi.<\/p>\n<p>Il se trouve que <code>None<\/code>, <code>\"\"<\/code>, <code>0<\/code>, <code>[]<\/code> ou encore <code>{}<\/code> par exemple sont tous \u00e9valu\u00e9s \u00e0 <code>False<\/code>.<\/p>\n<p>Pour compl\u00e9ment, lorsque qu&rsquo;un objet est pr\u00e9c\u00e9d\u00e9 de <code>if<\/code>, son \u00e9valuation bool\u00e9enne est aussi ex\u00e9cut\u00e9e.<br \/>\nCela permet entre autres d&rsquo;\u00e9crire:<\/p>\n<pre name=\"code\" class=\"py:nogutter:nocontrols\">\r\nmy_list = get_list()\r\nif my_list:\r\n    # ... do things\r\n<\/pre>\n<p>au lieu de:<\/p>\n<pre name=\"code\" class=\"py:nogutter:nocontrols\">\r\nmy_list = get_list()\r\nif my_list is not None and len(my_list) > 0:\r\n    # ...\r\n<\/pre>\n<p>\u00c9l\u00e9gant, non? Il m&rsquo;arrive souvent d&rsquo;impl\u00e9menter cette fonction <code>__nonzero__<\/code> dans mes classes, lorsque \u00e7a a du sens. Par exemple, une classe repr\u00e9sentant un fichier pourrait \u00eatre \u00e9quivalent \u00e0 <code>True<\/code> si le fichier existe.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Aujourd&rsquo;hui, on \u00e9crit du code compact. Savez-vous qu&rsquo;il est possible d&rsquo;utiliser le mot cl\u00e9 python or pour une affectation de valeur conditionnelle simple et \u00e9l\u00e9gante? Lorsque l&rsquo;on souhaite affecter conditionnellement des valeurs, on aura&#46;&#46;&#46;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[4],"tags":[258,256,257,255,38],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/saladtomatonion.com\/blog\/wp-json\/wp\/v2\/posts\/1058"}],"collection":[{"href":"https:\/\/saladtomatonion.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/saladtomatonion.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/saladtomatonion.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/saladtomatonion.com\/blog\/wp-json\/wp\/v2\/comments?post=1058"}],"version-history":[{"count":10,"href":"https:\/\/saladtomatonion.com\/blog\/wp-json\/wp\/v2\/posts\/1058\/revisions"}],"predecessor-version":[{"id":1068,"href":"https:\/\/saladtomatonion.com\/blog\/wp-json\/wp\/v2\/posts\/1058\/revisions\/1068"}],"wp:attachment":[{"href":"https:\/\/saladtomatonion.com\/blog\/wp-json\/wp\/v2\/media?parent=1058"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/saladtomatonion.com\/blog\/wp-json\/wp\/v2\/categories?post=1058"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/saladtomatonion.com\/blog\/wp-json\/wp\/v2\/tags?post=1058"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}