Python 3.11の新機能試す(1) - トレースバックのエラー位置の改善
app | version |
---|---|
Python | 3.11 rc1 |
本日試す機能
本日試すのはこちら。
PEP 657: Enhanced error locations in tracebacks 「トレースバックのエラー位置の改善」とでも訳すのがよさそう。
対応するPEP
試してみたコード
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)のかが追いやすくなっていますね! これはなかなかいい