Keep on moving

あんまりまとまってないことを書きますよ

Python 3.11の新機能試す(1) - トレースバックのエラー位置の改善

app version
Python 3.11 rc1

本日試す機能

本日試すのはこちら。

PEP 657: Enhanced error locations in tracebacks 「トレースバックのエラー位置の改善」とでも訳すのがよさそう。

対応するPEP

peps.python.org

試してみたコード

from dataclasses import dataclass


@dataclass
class Point:
    x: int
    y: int


def manhattan_distance(p1, p2):
    return abs(p1.x - p2.x) + abs(p1.y - p2.y)


if __name__ == "__main__":
    p1 = Point(x=1, y=2)
    p2 = None  # Ouch!!! forget to initialize it for some reason

    print(manhattan_distance(p1, p2))

これを実行すると 3.10では

% python3.10 distance.py 
Traceback (most recent call last):
  File "/Users/masahito/src/python/try_3_11/distance.py", line 16, in <module>
    print(manhattan_distance(p1, p2))
  File "/Users/masahito/src/python/try_3_11/distance.py", line 9, in manhattan_distance
    return abs(p1.x - p2.x) + abs(p1.y - p2.y)
AttributeError: 'NoneType' object has no attribute 'x

どこでエラーになっているかはわからない。

けど、3.11で実行すると

% python3.11 distance.py
Traceback (most recent call last):
  File "/Users/masahito/src/python/try_3_11/distance.py", line 16, in <module>
    print(manhattan_distance(p1, p2))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/masahito/src/python/try_3_11/distance.py", line 9, in manhattan_distance
    return abs(p1.x - p2.x) + abs(p1.y - p2.y)
                      ^^^^
AttributeError: 'NoneType' object has no attribute 'x'

となって、エラーになっている行だけではなく、変数のどこで何が起こっている(今回の場合は変数がnone)のかが追いやすくなっていますね! これはなかなかいい