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