Python arrive à son prochain jalon important, la version 3.6. Avec une release attendue pour décembre 2016, Python 3.6 apporte beaucoup de nouvelles fonctionnalités, dont des dictionnaires plus rapides et compacts, une amélioration de asyncio
, un nouveau protocole de gestion des chemins d'accès au système de fichiers, et bien plus encore.
Python 3.6 introduit des améliorations sur le type dict
qui réduit l'empreinte mémoire de près de 20% par rapport à Python 3.5. Le langage utilise une nouvelle représentation similaire à celle de PyPy et a montré qu'elle améliore aussi la performance du garbage collector.
La nouvelle version simplifie aussi la création de sous-classes sur mesure grâce à la nouvelle méthode __init_subclass__
qui appelle la classe mère à chaque création de sous-classe :
class PluginBase: subclasses = [] def __init_subclass__(cls, **kwargs): super().__init_subclass__(**kwargs) cls.subclasses.append(cls) class Plugin1(PluginBase): pass class Plugin2(PluginBase): pass
Ce nouveau mécanisme est une sorte d'alternative simplifiée à l'usage du mécanisme de metaclass
pour la customisation de classe.
Sur le sujet de la librairie standard, il y a de nombreuses améliorations ou nouveaux modules à citer : le module asyncio
n'est plus provisoire et son API est considérée comme stable, tandis que le nouveau module secrets
propose une manière fiable de générer des valeurs pseudo-aléatoires cryptographiquement fortes, comme celles requises pour gérer l'authentification, les jetons, etc. De plus, le module typing, qui implémente les spécifications du type hints, est passé au statut stable.
Les autres fonctionnalités de Python 3.6 sont :
- L'interpolation de chaîne de caractères litérales avec des "formatted string literals" comme dans l'exemple suivant :
>>> name = "Fred" >>> f"He said his name is {name}." 'He said his name is Fred.' >>> width = 10 >>> precision = 4 >>> value = decimal.Decimal("12.34567") >>> f"result: {value:{width}.{precision}}" # nested fields 'result: 12.35'
- Les soulignements dans les numériques, qui permettent d'écrire :
>>> 1_000_000_000_000_000 1000000000000000 >>> 0x_FF_FF_FF_FF 4294967295
- Les générateurs asynchrones rendus possibles en éliminant les contraintes de
await
etasync
qui ne pouvaient être utilisés dans le même corps de fonction :
async def ticker(delay, to): """Yield numbers from 0 to *to* every *delay* seconds.""" for i in range(to): yield i await asyncio.sleep(delay)
- Les comprehensions asynchrones, comme dans l'exemple suivant :
result = [i async for i in aiter() if i % 2]
La liste complète des nouvelles améliorations de Python 3.6 sont dans le document what’s new.