Python 3.11

Par:
fredericmazue

mar, 25/10/2022 - 14:15

La fondation Python a annoncé la disponibilité de Python 3.11. Une mouture riche ainsi qu'en témoigne la note de version. La nouveauté la plus intéressante pou le développeur est sans doute l'implémentation de la proposition d'amélioration PEP 657 dont le but est d'ajouter un mappage de chaque instruction de bytecode aux décalages de colonne de début et de fin de la ligne qui les a générés ainsi que le numéro de ligne de fin. Ces données sont utilisées pour améliorer les traces affichées par l'interpréteur CPython afin d'améliorer l'expérience de débogage.

Jusqu'ici Python conservait un mappage du bytecode aux numéros de ligne de la compilation. L'interpréteur utilisait ce mappage pour pointer vers la ligne source associée à une erreur. Bien que cette granularité au niveau de la ligne pour les instructions soit utile, une seule ligne de code Python peut se compiler en des dizaines d'opérations de bytecode, ce qui rend difficile le suivi de la partie de la ligne à l'origine de l'erreur.

Soit par exemple

x['a']['b']['c']['d'] = 1

Si l'une des valeurs des dictionnaires estNone, avec l'ancien mécanisme l'erreur affichée est :

Traceback (most recent call last):
  File "test.py", line 2, in <module>
    x['a']['b']['c']['d'] = 1
TypeError: 'NoneType' object is not subscriptable

Avec le nouveau mécanisme l'interpréteur peut afficher

Traceback (most recent call last):
  File "test.py", line 2, in <module>
    x['a']['b']['c']['d'] = 1
    ~~~~~~~~~~~^^^^^
TypeError: 'NoneType' object is not subscriptable

La PEP 657 a pensé à offrir un mécanisme de désactivation aux utilisateurs qui se soucient de la surcharge de stockage et de mémoire et pour permettre d'utiliser des outils tiers et autres programmes qui analysent actuellement les tracebacks. Il y a deux possibilités pour activer ce ménaisme de désactivation :

  • Une nouvelle variable d'environnement : PYTHONNODEBUGRANGES.
  • Une nouvelle option de ligne de commande pour le mode dev : python -Xno_debug_ranges

Si l'une de ces méthodes est utilisée, le compilateur Python ne remplira pas les objets de code avec les nouvelles informations