改めて見るPython3.10の新機能
Published
「おいおい、今更Python3.10の話題かい?」
と思う人もいるかも知れませんが、この度、AWS Lambda でPython3.10ランタイムサポートが開始されたと公式から正式にアナウンスメントがありました。今の現場でも現行のPython3.9からPython3.10への移行が決まったので、実装に影響しそうな変更点をピックアップして見ていきたいと思います。
主要変更点
パターンマッチ
Python3.9以前だと値によって処理を分岐させたい場合は以下のようにif文を使う必要がありました。
score = 80
if score < 70:
print('Not Good')
elif score < 100:
print('Good')
else:
print('Excellent')
Python3.10ではmatch文を使用して以下のように書くことができます。
score = 80
match score:
case x if x < 70:
print('Not Good')
case x if x < 100:
print('Good')
case _:
print('Excellent')
_
はワイルドカードと呼ばれ、マッチパターンがなかった場合に選択されるパターンになります。
|
演算子による型の指定
Pythonで型定義をする場合以下のように型定義ができるようになります。
from typing import Union, Optional
# Python3.9以前
year: Union[str, int] = '2023'
age: Optional[int] = 18
# Python3.10
year: str | int = '2023'
age: int | None = 18
zip()
関数に引数 strict
が追加
Pythonのzip()
関数では以下のように引数に指定したリストオブジェクトなどのイテラブルオブジェクトから要素を一つづつ取得し、組み合わせてタプルを作成することができます。
fruits = ['Apple', 'Grape', 'Orange', 'banana']
prices = [100, 200, 300, 400]
stock = [10, 20, 30]
for result in zip(fruits, prices, stock):
print(result)
# 実行結果
('Apple', 100, 10)
('Grape', 200, 20)
('Orange', 300, 30)
しかし、実行結果から分かる通り、長さの異なるリストを渡した場合は最も短いリストの要素数分だけ処理が実行されることになります。zip()
関数使用時は「全てのリストの要素数が同じ」ということを前提に処理を行いたい
ケースが多くあると思います。しかし、前述の仕様から「全てのリストの要素数が同じ」という条件の担保は自前で行う必要があります。そこで、新たに追加された`strict`引数を使用することで以下のように要素数が異なる場合は例外が発生するようになりました。
fruits = ['Apple', 'Grape', 'Orange', 'banana']
prices = [100, 200, 300, 400]
stock = [10, 20, 30]
for result in zip(fruits, prices, stock, strict=True):
print(result)
# 実行結果
('Apple', 100, 10)
('Grape', 200, 20)
('Orange', 300, 30)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[8], line 5
2 prices = [100, 200, 300, 400]
3 stock = [10, 20, 30]
----> 5 for result in zip(fruits, prices, stock, strict=True):
6 print(result)
ValueError: zip() argument 3 is shorter than arguments 1-2
エラーメッセージの改善
Python3.10ではエラーメッセージが改善され、エラーの原因が分かりやすくなりました。
data = [1, 2, 3, 4, 5
def my_func(data):
for i in data:
print(i * 2)
my_func(data)
# 実行結果(Python3.9以前)
File "<ipython-input-1-91932ba9ebea>", line 4
def my_func(data):
^
SyntaxError: invalid syntax
# 実行結果(Python3.10)
File "<ipython-input-1-91932ba9ebea>", line 1
data = [1, 2, 3, 4, 5
^
SyntaxError: '[' was never closed
これ、自分もPythonを学び始めたときに何度も遭遇したのですが、data
のリストの閉じ忘れが原因なのにPython3.9以前だとmy_func()
の処理が間違ってるように見えるんですよね。しかも、SyntaxError: invalid syntax
という大雑把な返しをされるのでエラーの原因を探すのが大変だった記憶があります。
OpenSSL 1.1.1が必須になった
新規開発ではもちろん、AWS LambdaのPythonバージョンに合わせて開発環境でもPythonのバージョンを上げる必要がありますが、その際に気をつけておくポイントです。特にCentOS 7ではインストールされているOpenSSLのバージョンが古いのでOpenSSL 1.1.1をインストールする必要があります。自分は実務でまさにこのケースに遭遇して時間を無駄にしたので、頭の片隅に置いておくと良いと思います。
というわけで、Python3.10の主な変更点のピックアップでした。
それでは、最後までお読みいただきありがとうございました。