2022-10-10 Python 3.11の新機能(その7) 型ヒントの新機能 - PEP-681 データクラス変換
Python 3.7で導入された dataclass はかなり広く使われるようになり、Pythonの型チェッカも dataclass
を認識してコーディングミスを防いでくれるようになっています。
ところで、Pythonのサードパーティライブラリには、似たようなインターフェースをもつクラスが多く存在します。たとえば DjangoのModel は次のようにデータベースのスキーマを定義します。
from django.db import models
class Person(models.Model):
first_name = models.
2022-10-09 Python 3.11の新機能(その6) 型ヒントの新機能 - PEP-673 Self型
Python 3.11では PEP-673 Self Type が実装され、 これも型ヒントではお待ちかねの新機能、定義中のクラスを示す型 typing.Self が追加されました。
従来のメソッド定義¶
これまでのPythonでは、クラスのメソッドなどを定義するとき、簡単にメソッドが属するクラスを取得する方法がありませんでした。このため、例えば自分自身を返り値とするメソッドのアノテーションを書くのは面倒で、Python 3.10までは typing.TypeVar を使って次のように記述していました。
from typing impor
2022-10-05 Python 3.11の新機能(その5) PEP-646 可変長ジェネリックス
Python 3.11でも、型ヒント 関連で多くの機能が追加されました。まず、長年望まれていた新機能、 PEP-646 可変長ジェネリックス の概要を紹介します。
可変長ジェネリックスについて説明する前に、まず普通のジェネリックスを復習しましょう。
ジェネリックス¶
まず、引数 a
を受け取り、要素が a
だけのタプルを返す関数を考えてみましょう。
def to_tuple(a):
return (a,)
to_tuple('100')
を実行すると、結果としてタプル ('100',)
が返ります。
この関数に型ヒントを指定してみましょう。引数 a
は
2022-09-21 Python 3.11の新機能(その4)PEP 654 例外グループとTaskGroup
Python 3.11では、新しい構文として、例外処理に try ~ except*
が追加されました
ちょっと用途がわかりにくい機能ですが、try ~ except*
は、主に asyncio による非同期処理で利用することを想定した機能で、asyncio
を使っていない場合はさしあたってあまり気にしなくても良いかもしれません。
ExceptionGroup例外¶
Python3.11では、組み込みの例外型に ExceptionGroup が追加されました。新しく追加された
2022-09-05 Python 3.11の新機能(その3)関数呼び出しのインライン化
Python 3.11では、パフォーマンスチューニングの一環として、Python関数呼び出しのインライン化 が行われました。既存のPythonインタープリタのしくみを大きく変更する変更ですので、簡単に解説しておきます。
先に書いておきますが、今回行われた「関数呼び出しのインライン化」は、C/C++などの inline
のように、ユーザ定義関数を呼び出し元で展開してオーバヘッドを削減するものではありません。また、Schemeなどにある末尾再帰の最適化でもありません。
cevalループ¶
Pythonインタープリタは、Pyt