SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Pythonの新機能を知ろう!

Python 3.14の新機能――再利用可能なテンプレート文字列や高効率な圧縮ライブラリを解説

Pythonの新機能を知ろう! 第6回

括弧なしのexcept/except*式を許可[3.14]

 Python 3.14では、except/except*式の記述方法のルールが緩和されました。これらを使って複数の例外をキャッチする場合、従来は例外のリストを丸カッコで囲む必要がありました。

リスト except.py
try:
    connect_to_server()
except (TimeoutError, ConnectionRefusedError):
    print("ネットワーク接続に問題があります。")

 Python 3.14では、こういった自明な記述には丸カッコは不要ということで、省略しても構わないとされました(従来通りに記述しても問題ありません)。

リスト except.py
try:
    connect_to_server()
except TimeoutError, ConnectionRefusedError:
    print("ネットワーク接続に問題があります。")

 ただし、as句を使う場合には従来通り丸カッコが必要となります。

リスト except.py
try:
    connect_to_server()
except (TimeoutError, ConnectionRefusedError) as e:
    print("ネットワーク接続に問題があります。")

 ここまではexcept式で説明してきましたが、ExceptionGroupを捕捉するexcept*式でも同様です。ExceptionGroupとexcept*式については第4回で紹介しています。

リスト except.py
try:
    connect_to_server()
except* TimeoutError, ConnectionRefusedError:
    print("ネットワーク接続に問題があります。")

アノテーションの遅延評価[3.14]

 Python 3.14では、型アノテーションの評価タイミングが即時から利用時に変更され、例えば前方参照となるような型を使ったアノテーションでも問題なく使えるようになりました。

 従来は、以下のリストのアノテーションは、実行時にNameErrorとなっていました。func関数の定義時点でクラスMyClassの定義が完了していないので、こうしたエラーになります。これは即時評価(Eagerly evaluation)と呼ばれます。

リスト eager_annotation.py
class MyClass:
    def func(arg: MyClass) -> MyClass:	# 3.13ではNameError
        return arg

 これを解決するには、次に説明する文字列アノテーションを使用する必要がありました。

文字列アノテーション

 文字列アノテーション(Stringized annotations)とは、型を文字列リテラルとして表記する仕組みで、Python 3.7で導入されました。この仕組みを使うと、上のリスト中で型アノテーションとして使われているMyClassは"MyClass"と表記することも可能で、この場合はNameErrorとはなりません。

リスト post_annotation.py
class MyClass:
    def func(arg: "MyClass") -> "MyClass":
        return arg

 文字列アノテーションは、使用されるときになって実際の型情報を取得します(評価の延期(Postponed evaluation))。

 ただし、いちいち文字列リテラルとしてアノテーションを記述するのもわずらわしいので、annotationsモジュールをimportすることでも、型名を自動で文字列化できます。

リスト str_annotation.py
from __future__ import annotations	# 追加

class MyClass:
    def func(arg: MyClass) -> MyClass:
        return arg

 このように文字列アノテーションを使うと、型の定義場所にかかわらずアノテーションに指定できますが、実際に型情報を取得する際のコストは即時評価に比べれば大きなものになります。また、一部のライブラリとの相性もよくないとされ、根本的な解決方法が模索されてきました。

遅延評価

 Python 3.14ではアノテーションの遅延評価(lazily evaluation)が導入され、即時評価のサンプル(eager_annotation.py)はエラーとならなくなりました。もちろん、アノテーションとしてきちんと機能しますし、annotationsモジュールも不要です。表面上はこれで終わりなのですが、アノテーションの処理方法の変化を確認してみましょう。

 以下のリストは、遅延評価が有効なPython 3.14で動作するコードです。

リスト lazy_annotation.py
class MyClass:
    def func(arg: MyClass) -> MyClass:
        return arg

c = MyClass()	# 以降の2行をstr_annotation.pyにも追記
print(c.func.__annotations__)

 実行すると、以下のように出力されます。関数の__annotations__は、アノテーションの情報を辞書形式で返す属性です。

{'arg': <class '__main__.MyClass'>, 'return': <class '__main__.MyClass'>}

 str_annotation.pyにも、最後の2つの文を追記して実行してください。実行結果が以下のように変わります。

{'arg': 'MyClass', 'return': 'MyClass'}

 ポイントは、同じ辞書形式でも、値がクラス情報と文字列という違いがあることです。遅延評価ではアノテーション情報に型の情報が含まれるので、必要になればすぐに使用できます。文字列アノテーションでは、改めて型情報を取得するコストが必要でした。

 なお、Python 3.14で導入されたannotationlibを使うと、get_annotations関数によりアノテーションの情報を複数の形式で取得できます。

リスト lazy_annotation.py
from annotationlib import get_annotations, Format
…略…
print(get_annotations(c.func, format=Format.VALUE))	# 実行時の値として評価
print(get_annotations(c.func, format=Format.FORWARDREF))	# 未定義の名前を特別なマーカーに置き換え
print(get_annotations(c.func, format=Format.STRING))	# アノテーションを文字列として返す

 このように、遅延評価が導入されたことで、型の定義順でエラーが発生することを特別な技法を使わずに避けることができ、しかも実行時のコストも最小限にできるようになりました。なお、これに伴い文字列アノテーション化はPython 3.13のサポート終了とともに非推奨となり、最終的には廃止される見込みです。

まとめ

 今回は、テンプレート文字列リテラルt-strings、高効率な圧縮のためのZstandard、括弧なしのexcept/except*式、アノテーションの遅延評価など、言語仕様やライブラリの強化を中心に紹介しました。

 次回は、フリースレッドPythonの正式サポート、テイルコールに基づく新型インタプリタによる高速化、エラーメッセージの改善や構文強調表示など、インタプリタや言語インタフェースの強化を中心に紹介します。

この記事は参考になりましたか?

Pythonの新機能を知ろう!連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/22392 2025/10/23 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング