Je suis de très près le développement du langage Python et en particulier de la prochaine version majeure : Python 3000. Cette version casse la compatibilité mais pour de bonnes raisons.

Types bytes et str

Dans Python 3000, une chaîne de caractères sera du type « str » (de l'anglais string) et non plus « unicode » (qui prêtait à confusion). L'actuel type « str » de Python 2.x devient le type « bytes » qui comme son nom l'indique contient des octets (bytes en anglais). Pour avoir tenté d'expliquer à de nombreuses reprises Unicode et la différence entre caractère et octet, je pense que c'est une très bonne chose. Je vous conseille la lecture de la PEP 358 (The "bytes" Object) pour les détails. Le type bytes sera disponible dans Python 2.6 et Python 3000.

Annotation des fonctions

Critique récurrente à Python : le prototype d'une fonction n'indique pas son type. De mon point de vue, c'est une qualité : celà permet de duck-typing (If it looks like a duck and quacks like a duck, it must be a duck : Si ça ressemble à canard et que ça fait le bruit d'un canard, ce doit être un canard). Mais le gros problème est qu'on n'a pas la possibilité de déterminer à la compilation si la fonction va échouer ou non car le type d'un argument est incompatible.

La PEP 3107 (Function Annotations) propose d'ajouter des annotations optionnelles aux arguments et au type de retour. Une fois que ça sera implémenté, je suis sûr que ça sera rapidement exploité par les outils de vérification automatiques tel que pychecker.

Exemple d'annotation :

def haul(item: Haulable, *vargs: PackAnimal) -> Distance:
    ...

Argument sous forme de mot-clé

Un autre défaut de Python 2.x : on ne peut pas indiquer qu'un argument ne peut être passé que sous la forme « mot-clé=valeur ». Exemple :

def afficheProduit(nom, prix, monnaie=u"€", note=None):
   print "%s: %s %s" % (nom, prix, monnaie)
   if note:
      print "(note: %s)" % note

Cette notation prête à confusion, on peut se tromper on oubliant de forcer d'indiquer qu'on veut spécifier une note : « afficheProduit("voiture", 100, "petite voiture rouge") ». Notre note sera passée en valeur de « monnaie », il aurait fallu écrire « afficheProduit("voiture", 100, note="petite voiture rouge") ».

La PEP 3102 (Keyword-Only Arguments) répond à ce problème avec la syntaxe suivante :

def afficheProduit(nom, prix, *, monnaie=u"€", note=None):
   print "%s: %s %s" % (nom, prix, monnaie)
   if note:
      print "(note: %s)" % note

L'appel « afficheProduit("disque", 50, "US$") » sera alors interdit, il faudra explicitement (Explicit is better than implicit) écrire « afficheProduit("disque", 50, monnaie="US$") ».

Dans mon exemple, ce n'est pas parlant mais lorsqu'on a 6 arguments ou plus, c'est bien pratique.

Documents sur Python 3000

Je ne voulais insister que sur les changements qui me semblaient les plus importants, mais Python 3000 change bien plus de choses ! Je vous conseille la présentation de Guido van Rossum : les slides « Python 3000 » (PowerPoint) et la vidéo « Python 3000 ».

Autres documents sur Python 3000 :

Et enfin, Python 3000 Status Update (19 juin 2007) par Guido Van Rossum.