# Principales nouveautés dans Python 2.5

Je m'y prend un peu à l'avance (la sortie est prévue pour septembre 2006) mais Guido a apparement fait quelques annonces lors de Pycon qui viennent s'ajouter aux PEPs approuvés sur la page officielle. 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.

Voici la liste des PEPs acceptés par ordre de soumission :

## PEP 308 : Ajout des expressions conditionnelles

Probablement pour remédier au difficilement compréhensible « and-or trick », même si Guido a jugé bon de laisser une syntaxe assez difficile pour des utilisations trop complexes intentionnellement (c'est vrai que le code devient vite illisible sinon).

Syntaxe : expression1 if condition else expression2

Exemples lisibles :

    x = A if C else B
    x = lambda: A if C else B
    x = A if C else B if D else E

Exemples peu lisibles mais corrects :

    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

Je sens que ça va faire fureur lors du « Annual Obfuscated Python Contest » !

## PEP 309 : L'application de fonctions partielles

Là je dois avouer que j'ai pas trop compris en quoi ça consistait mais c'est la première amélioration citée dans What's New in Python 2.5 donc j'imagine que c'est assez important, j'attend vos explications ;-).

## PEP 314 : Méta-données pour les paquets Python

Bon le titre est assez explicite, un exemple :

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

Voila qui devrait ravir les concepteurs de paquets.

## PEP 328 : Imports absolus/relatifs

Outre le fait de permettre un import sur plusieurs lignes :

    from Tkinter import Tk, Frame, Button, Entry, \
       LEFT, DISABLED, NORMAL, RIDGE, END

Pourra maintenant être déclaré ainsi :

    from Tkinter import (Tk, Frame, Button, Entry,
       LEFT, DISABLED, NORMAL, RIDGE, END)

[Edit du 06.03.06] : comme le souligne tarek dans les commentaires, cette fonctionnalité est déjà implémentée dans python 2.4.

Cette amélioration permet aussi d'importer des modules relativement :

    from ..subpackage1 import moduleY

Par exemple pour importer le moduleY qui serait un dossier parent subpackage1.

## PEP 341 : Unification de try-except et try-finally

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

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

Et c'est vraiment lourd, simplement car try-except-finally n'est pas possible actuellement, c'est ce que propose ce PEP et ce sera donc réglé avec Python 2.5, ouf !

## PEP 342 : Coroutines par générateurs améliorés

É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é...

## PEP 343 : Le mot-clé « with »

with 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 :

    with open(filename) as f:
        f.read()

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 :

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

Deviendra :

    with locked(myLock):
        # mon opération

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

## Conclusion

Toutes ces améliorations sont très frustrantes car c'est exactement ce dont j'ai besoin maintenant ! Vivement septembre.

Et pour fini lambda est conservé, au grand regret de Guido... et cElementTree est inséré dans la bibliothèque standard.

[Bonus] : une vidéo à voir absolument qui s'intitule Better Web App (378.5mo, 36 minutes, anglais) et qui compare différent Web Frameworks (RoR, Zope/Plone, TurboGears et Django) et fourni en conclusion un tableau récapitulatif intéressant :

[Edit du 06.03.06] : La home de Python.org est en pleine mue \o/ (en passant un lien intéressant au sujet des nouveautés de Python 2.5).

[Edit du 11.03.06] : Le PEP 356 résume tout ça et comprend le calendrier de développement (encore un bonus, l'interview de GvR sur eweek).

[Edit du 22.06.06] : L'annonce de Python 2.5 beta 1 sur dlfp qui est complétée de nombreux exemples (cette fois en bonus de beaux icônes :-)).

### Articles peut-être en rapport

- Bonnes pratiques et astuces Python
- Benchmarks map, filter vs. list-comprehensions
- Python : lisibilité vs simplicité

### Commentaires

tarek le 05/03/2006 :

Pour le PEP 328, l'import multiligne a déjà été implémenté dans Python 2.4

S.F. le 12/03/2006 :

Si j'ai bien compris, les fonctions partielles permettent de donner une valeur à un argument d'une fonction. Ainsi,
g = functional.partial(f, arg1 = 1')
serait équivalent à
g = lambda x, y: f(1, x, y)

David, biologeek le 19/03/2006 :

Merci pour ces précisions nud, c'était donc bien pour remplacer lambda.

David le 31/07/2006 :

sympa le "with locked", j'en aurai besoin NOW !