Upgrade to Pro — share decks privately, control downloads, hide ads and more …

lt20221030.pdf

 lt20221030.pdf

とにほめLT会
2022/10/30

shimakaze-git

October 31, 2022
Tweet

More Decks by shimakaze-git

Other Decks in Programming

Transcript

  1. Enhanced error locations in tracebacks 以下のようなコードがあるとする def distance(p1, p2): dx

    = abs(p1["x"] - p2["x"]) dy = abs(p1["y"] - p2["y"]) return {"x": dx, "y": dy} point_1 = {"x": 50, "y": 60} point_2 = {"x": 10, "z": 20} d = distance(point_1, point_2)
  2. Enhanced error locations in tracebacks Python 3.10での実行結果 Traceback (most recent

    call last): File "/Users/pyq/scripts/distance.py", line 10, in <module> d = distance(point_1, point_2) File "/Users/pyq/scripts/distance.py", line 3, in distance dy = abs(p1["y"] - p2["y"]) KeyError: 'y'
  3. Enhanced error locations in tracebacks Python 3.11での実行結果 File "/Users/pyq/scripts/distance.py", line

    10, in <module> d = distance(point_1, point_2) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/pyq/scripts/distance.py", line 3, in distance dy = abs(p1["y"] - p2["y"]) ~~^^^^^ KeyError: 'y'
  4. Enhanced error locations in tracebacks どの位置でエラーが発生したのかも表示してくれる File "/Users/pyq/scripts/distance.py", line 10,

    in <module> d = distance(point_1, point_2) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/pyq/scripts/distance.py", line 3, in distance dy = abs(p1["y"] - p2["y"]) ~~^^^^^ KeyError: 'y'
  5. Pythonの型定義 Pythonは型チェックに厳しくない - 型が間違っていても動作はする - mypyというサードパーティのツールを使用するのが一般的 - 最近はPylanceを使用する # ファイルだけでなくディレクトリの指定もできる

    $ mypy sample.py sample.py:7: error: Argument 1 to "sum" has incompatible type "Union[int, List[int]]"; expected "Iterable[int]" sample.py:9: error: Unsupported operand types for + ("int" and "List[int]") sample.py:9: note: Right operand is of type "Union[int, List[int]]"
  6. PEP:655 from typing import TypedDict class Movie(TypedDict): title: str year:

    int TypedDictを使用して、titleとyearというキーを定義
  7. PEP:655 # No Error bttf: Movie = {"title": "バック・トゥ・ザ・フューチャー", "year":

    1985} # Error bttf2: Movie = {"title": "バック・トゥ・ザ・フューチャー PART2"} 下記がエラーになる
  8. PEP:655 yearを必須では無いようにしたい - NotRequiredを加える from typing import TypedDict, NotRequired class

    Movie(TypedDict): title: str year: NotRequired[int] 下記がエラーではなくなる # Error bttf2: Movie = {"title": "バック・トゥ・ザ・フューチャー PART2"}
  9. PEP:673 実行はできるが型チェックではエラーになる class Shape: def set_scale(self, scale: float) -> Shape:

    self.scale = scale return self class Circle(Shape): def set_radius(self, radius: float) -> Circle: self.radius = radius return self Circle().set_scale(0.5).set_radius(2.7)
  10. PEP:673 Selfを使用して以下の書き方ができる from typing import Self class Shape: def set_scale(self,

    scale: float) -> Self: self.scale = scale return self class Circle(Shape): def set_radius(self, radius: float) -> Self: self.radius = radius return self