Journal Entry
Pythonのmatch-caseで困ったところ
#プログラミング#Python
Pythonのmatch-caseで困ったところ
やりたかったこと
val: int | float | bool | str = ...
if (type(val) is int) or (type(val) is float):
...
elif type(val) is bool:
...
else:
...
if-elseで書いた上のような処理をmatch-caseを用いてやりたいと思いました。
- やりたかったこと
- 型によって処理を分ける
- 複数条件で同じ処理を実行
- 上の例なら、
valの型がintとfloatで同じ処理を行う
- 上の例なら、
やりたかった動機は、type(val)をいたるところに書く必要があり、コードが読みにくかったからです。
やろうとしてダメだったコード
----
icon: ⚠
title: 下のコードを実行するとエラーが発生します
----
val: int | float | bool | str = ...
match type(val):
case int:
case float:
...
case bool:
...
case _:
...
JavaScriptとかだったらこんな感じの書き方をしたはずですが、Pythonではダメでした。
成功するコード
val: int | float | bool | str = ...
match val:
case int() | float():
...
case bool():
...
case _:
...
個人的には失敗したコードのほうが自然なんですけど、Pythonではこちらのコードが正しいらしいです。
pythonで普通にint()を実行すると0と出力されるので、val == 0でなければ中の処理が実行されなさそうですが、そんなことはなく、たとえばval == 1でもcase int():の処理が実行されます。不思議ですね。
クラスパターンというPythonの仕様だそうですが、うーんと思ってしまいました。
まとめ
----
icon: 💡
title: "`val`がある型`Class`のインスタンスかどうか判定したい"
----
- `match val`とする
- `case Class():`とする
----
icon: 💡
title: "`val`がある値`a`または`b`であることを判定したい"
----
- `case a | b:`とする