title:      Principales nouveautés dans Python 2.5
slug:       principales-nouveautes-dans-python-25
date:       2006-03-04 14:11:30
type:       post
vignette:   images/logos/python.png
contextual_title1:  Bonnes pratiques et astuces Python
contextual_url1:    20080511-bonnes-pratiques-et-astuces-python
contextual_title2:  Benchmarks map, filter vs. list-comprehensions
contextual_url2:    20061025-benchmarks-map-filter-vs-list-comprehensions
contextual_title3:  Python : lisibilité vs simplicité
contextual_url3:    20060425-python-et-underscore

<p>Je m'y prend un peu à l'avance (la sortie est prévue pour septembre 2006) mais Guido a apparement fait <a href="http://agiletesting.blogspot.com/2006/02/pycon-notes-part-2-guidos-keynote.html">quelques annonces lors de Pycon</a> qui viennent s'ajouter aux <a href="http://www.python.org/dev/doc/devel/whatsnew/whatsnew25.html"><abbr title="Python Enhancement Proposals">PEP</abbr>s approuvés sur la page officielle</a>. J'essayerais de mettre à jour ce billet lors de l'annonce de nouvelles nouveautés histoire qu'il ne soit pas obsolète dans 6 mois, n'hésitez pas à m'en informer.</p>

<p>Voici la liste des <abbr title="Python Enhancement Proposals">PEP</abbr>s acceptés par ordre de soumission&nbsp;:</p>


<h2><abbr title="Python Enhancement Proposals">PEP</abbr> <a href="http://www.python.org/doc/peps/pep-0308/">308</a>&nbsp;: Ajout des expressions conditionnelles</h2>


<p>Probablement pour remédier au difficilement compréhensible «&nbsp;<a href="http://diveintopython.adrahon.org/power_of_introspection/and_or.html#d0e10029">and-or trick</a> », même si <a href="http://mail.python.org/pipermail/python-dev/2005-September/056846.html">Guido a jugé bon de laisser une syntaxe assez difficile</a> pour des utilisations trop complexes intentionnellement (c'est vrai que le code devient vite illisible sinon).</p>


<p>Syntaxe&nbsp;: expression1 <strong>if</strong> condition <strong>else</strong> expression2</p>


<p>Exemples lisibles&nbsp;:</p>


<pre>x = A if C else B
x = lambda: A if C else B
x = A if C else B if D else E</pre>


<p>Exemples peu lisibles mais corrects&nbsp;:</p>


<pre>if (A if C else B):
[x for x in seq if (A if C else B)]
A if (X if C else Y) else B
(A if C else B) if D else E</pre>


<p>Je sens que ça va faire fureur lors du «&nbsp;Annual Obfuscated Python Contest »&nbsp;!</p>


<h2><abbr title="Python Enhancement Proposals">PEP</abbr> <a href="http://www.python.org/doc/peps/pep-0309/">309</a>&nbsp;: L'application de fonctions partielles</h2>


<p>Là je dois avouer que j'ai pas trop compris en quoi ça consistait mais c'est la <a href="http://www.python.org/dev/doc/devel/whatsnew/node2.html">première amélioration citée</a> dans What's New in Python 2.5 donc j'imagine que c'est assez important, j'attend vos explications ;-).</p>


<h2><abbr title="Python Enhancement Proposals">PEP</abbr> <a href="http://www.python.org/doc/peps/pep-0314/">314</a>&nbsp;: Méta-données pour les paquets Python</h2>


<p>Bon le titre est assez explicite, un exemple&nbsp;:</p>


<pre>Metadata-Version: 1.1
Version: 1.0
Platform: Linux2
Supported-Platform: Ubuntu 5.10
Summary: Mon premier paquet
...</pre>


<p>Voila qui devrait ravir les concepteurs de paquets.</p>


<h2><abbr title="Python Enhancement Proposals">PEP</abbr> <a href="http://www.python.org/doc/peps/pep-0328/">328</a>&nbsp;: Imports absolus/relatifs</h2>


<p><del>Outre le fait de permettre un import sur plusieurs lignes :</del></p>


<pre>from Tkinter import Tk, Frame, Button, Entry, \
   LEFT, DISABLED, NORMAL, RIDGE, END</pre>


<p>Pourra maintenant être déclaré ainsi&nbsp;:</p>


<pre>from Tkinter import (Tk, Frame, Button, Entry, 
   LEFT, DISABLED, NORMAL, RIDGE, END)</pre>


<p><strong>[Edit du 06.03.06]</strong>&nbsp;: comme le souligne tarek dans les commentaires, cette fonctionnalité est déjà implémentée dans python 2.4.</p>


<p>Cette amélioration permet aussi d'importer des modules relativement&nbsp;:</p>


<pre>from ..subpackage1 import moduleY</pre>


<p>Par exemple pour importer le <strong>moduleY</strong> qui serait un dossier parent <strong>subpackage1</strong>.</p>


<h2><abbr title="Python Enhancement Proposals">PEP</abbr> <a href="http://www.python.org/doc/peps/pep-0341/">341</a>&nbsp;: Unification de try-except et try-finally</h2>


<p>C'est exactement ce dont j'ai besoin en ce moment, en effet j'utilise <strong>finally</strong> pour fermer les fichiers ouverts dans tous les cas et du coup j'ai quelque chose qui ressemble à&nbsp;:</p>


<pre>f = None
    try:
        try:
            f = open(filename)
            text = f.read()
        except IOError:
            print 'An error occured'
     finally:
         if f:
             f.close()</pre>


<p>Et c'est vraiment lourd, simplement car try-except-finally n'est pas possible actuellement, c'est ce que propose ce <abbr title="Python Enhancement Proposals">PEP</abbr> et ce sera donc réglé avec Python 2.5, ouf&nbsp;!</p>


<h2><abbr title="Python Enhancement Proposals">PEP</abbr> <a href="http://www.python.org/doc/peps/pep-0342/">342</a>&nbsp;: Coroutines par générateurs améliorés</h2>


<p>Énormément d'améliorations relatives aux générateurs, ce serait trop long de tout décrire ici. En plus je n'en ai pas compris la moitié...</p>


<h2><abbr title="Python Enhancement Proposals">PEP</abbr> <a href="http://www.python.org/doc/peps/pep-0343/">343</a>&nbsp;: Le mot-clé «&nbsp;with »</h2>


<p><strong>with</strong> permet d'effectuer une opération sur un objet, par exeple dans le cas d'un fichier il permettra de le lire sans avoir à le fermer à la fin&nbsp;:</p>


<pre>with open(filename) as f:
    f.read()</pre>


<p>Cette syntaxe permettra de simplifier les ouvertures fermetures de fichiers sans avoir à gérer ça avec des exceptions. Elle sera aussi très utile en cas de vérrou à placer&nbsp;:</p>


<pre>def locked(lock):
    lock.acquire()
        try:
            # mon opération
        finally:
            lock.release()</pre>


<p>Deviendra&nbsp;:</p>


<pre>with locked(myLock):
    # mon opération</pre>


<p>C'est aussi une amélioration qui me servirait bien en ce moment ça...</p>


<h2>Conclusion</h2>


<p>Toutes ces améliorations sont très frustrantes car c'est exactement ce dont j'ai besoin <strong>maintenant</strong>&nbsp;! Vivement septembre.</p>


<p>Et pour fini <strong>lambda</strong> est <a href="http://mail.python.org/pipermail/python-dev/2006-February/060415.html">conservé, au grand regret de Guido...</a> et cElementTree est inséré dans la bibliothèque standard.</p>


<p><strong>[Bonus]</strong>&nbsp;: une vidéo à voir absolument qui s'intitule <a href="http://oodt.jpl.nasa.gov/better-web-app.mov">Better Web App</a> (378.5mo, 36 minutes, anglais) et qui compare différent Web Frameworks (<abbr title="Ruby on Rails">RoR</abbr>, Zope/Plone, TurboGears et Django) et fourni en conclusion un tableau récapitulatif intéressant&nbsp;:</p>


<p><img src="/static/david/biologeek/images/better_web_app.jpg" alt="Tableau comparatif entre les Web Frameworks" style="display:block; margin:0 auto;" /></p>


<p><strong>[Edit du 06.03.06]</strong>&nbsp;: La home de <a href="http://www.python.org/">Python.org</a> est en pleine mue \o/ (en passant un <a href="http://linuxgazette.net/124/orr.html">lien intéressant</a> au sujet des nouveautés de Python 2.5).</p>


<p><strong>[Edit du 11.03.06]</strong>&nbsp;: Le <abbr title="Python Enhancement Proposals">PEP</abbr> <a href="http://www.python.org/doc/peps/pep-0356/">356</a> résume tout ça et comprend le calendrier de développement (encore un bonus, l'<a href="http://www.eweek.com/article2/0,1895,1934746,00.asp">interview de <abbr title="Guido van Rossum">GvR</abbr> sur eweek</a>).</p>


<p><strong>[Edit du 22.06.06]</strong>&nbsp;: L'annonce de <a href="http://linuxfr.org/~linuxcode/21967.html">Python 2.5 beta 1</a> sur dlfp qui est complétée de nombreux exemples (cette fois en bonus <a href="http://doxdesk.com/img/software/py/icons2.png">de beaux icônes</a> :-)).</p>
