SHOEISHA iD

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

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

Pythonの新機能を知ろう!

【Python 3.12への道のり】3.10で実装された型機能など、魅力的な機能を正式リリースまでに使いこなす

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

ユーザ定義の型ガードが関数により定義可能に

 ユーザ定義の関数を型ガードに使うとうまく機能しない場合に、ユーザ定義型ガードを使うことで型ガードのサポートを向上させます。

型ガードとは?

 型ガードとは、静的型チェッカが型の絞り込みに利用する条件のことをいいます。型の絞り込み(type narrowing)とは、プログラムの処理から型の情報を取得することです。例えば以下のリストでは、本来であれば型チェックが働いてエラーとなるところを、処理上は問題ないとしてエラーを回避しています。

リスト typeguard_safe.py
# Noneを必ず返す関数
def return_none():
    return None

# xは必ずNoneとなる
x: str | None = return_none()		(1)

# if文が型ガードになりprint文はエラーにならない
if type(x) is str:
  print(x * 10)                    (2)

 (1)で、変数xはstrまたはNoneをとることが定義されていますが、(2)のtype関数とis演算子による条件式によってxがstr型である場合のみprint文が実行されると見なされるので、チェックによってエラーは発生しません。このような条件が型ガードです。型ガードには、他にisinstance関数など型を特定できるようなものが含まれます。

ユーザ定義型ガード

 このように便利な型ガードですが、常にうまく働くとは限りません。例えば、条件の判定に独自の関数を使っていたりすると、型ガードがうまく働きません。そこで、Python 3.10ではtyping.TypeGuardによるユーザ定義型ガードを利用できるようになりました。以下のリストでは、本来ならbool型を返す関数の戻り値をTypeGuard型として、型の絞り込みをサポートしています。

リスト ud_typeguard.py
from typing import List, TypeGuard	(1)

# 戻り値がTrueならxはList[str]と見なす関数
def is_string_list(x: List[object]) -> TypeGuard[List[str]]:		(2)
  for a in x:
    if not isinstance(a, str):
      return False
  return True

# リストを作成
a:List = ['hello', 1, 'world']		(3)

# ユーザ定義型ガード関数を呼び出して型を絞り込む
if is_string_list(a):			(4)
  print(','.join(a))

 (1)では、Listに加えてユーザ定義型ガードのためのTypeGuardをインポートしています。

 (2)のis_string_list関数の定義では、戻り値の型をTypeGuard[List[str]]としています。これが、ユーザ定義型ガードのための記述です。関数の処理内容は、リストの全要素が文字列であるかを調べて返すというものです。これを満たして関数がTrueを返す場合、最初の引数の型がTypeGuardの引数の型であると見なします。

 (3)はリストを作成していますが、3つの要素のうち2つ目だけがintになっているので、(4)のユーザ定義型ガードの働きでprint文は静的型チェックでエラーとはなりません。

まとめ

 今回は、Python 3.10以降の機能のうち、Union型、パラメータ仕様変数、明示的な型エイリアス、ユーザ定義の型ガードを紹介しました。

 次回は、可変長ジェネリクス、Self型、改良されたTypedDict、文字列リテラル型、データクラス変換など、Python 3.11で追加された機能を中心に紹介します。

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
Pythonの新機能を知ろう!連載記事一覧

もっと読む

この記事の著者

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

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/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編 」他、著書多数

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/18356 2023/10/02 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング