Python 3.11 présentera de meilleures traces d'erreur

Par:
fredericmazue

mar, 16/11/2021 - 14:25

Python 3.11 est actuellement en cours de développement. Cette version à venir est au stade alpha 2 au moment où nous écrivons ces lignes et la sortie définitive est prévue début octobre 2022. Nous savons déjà que Python 3.11 offrira de bien meilleures traces d'erreurs, ce qui facilitera la mise au point du code.

Ainsi, lors de l'impression des traces d'erreurs, l'interpréteur pointera désormais vers l'expression exacte qui a causé l'erreur au lieu de simplement la ligne. Par exemple:

Traceback (most recent call last):
  File "distance.py", line 11, in <module>
    print(manhattan_distance(p1, p2))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "distance.py", line 6, in manhattan_distance
    return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
                           ^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'x'

Les versions précédentes de l'interpréteur pointaient uniquement sur la ligne, ce qui rendait ambigu quel objet était None dans l'exemple ci-dessus. Ces traces d'erreurs améliorées peuvent également être utiles lors du traitement d'objets de dictionnaire profondément imbriqués et d'appels de fonctions multiples :

Traceback (most recent call last):
  File "query.py", line 37, in <module>
    magic_arithmetic('foo')
    ^^^^^^^^^^^^^^^^^^^^^^^
  File "query.py", line 18, in magic_arithmetic
    return add_counts(x) / 25
           ^^^^^^^^^^^^^
  File "query.py", line 24, in add_counts
    return 25 + query_user(user1) + query_user(user2)
                ^^^^^^^^^^^^^^^^^
  File "query.py", line 32, in query_user
    return 1 +
query_count(db, response['a']['b']['c']['user'], retry=True)
                ~~~~~~~~~~~~~~~~~~^^^^^
TypeError: 'NoneType' object is not subscriptable

ainsi que des expressions arithmétiques complexes :

Traceback (most recent call last):
  File "calculation.py", line 54, in <module>
    result = (x / y / z) * (a / b / c)
              ~~~~~~^~~
ZeroDivisionError: division by zero