Skip to content

Latest commit

 

History

History
327 lines (191 loc) · 11.8 KB

File metadata and controls

327 lines (191 loc) · 11.8 KB

Pythonの型の紹介

Python 3.6以降 では「型ヒント」オプションがサポートされています。

これらの "型ヒント" は変数の型を宣言することができる新しい構文です。(Python 3.6以降)

変数に型を宣言することでエディターやツールがより良いサポートを提供することができます。

ここではPythonの型ヒントについての クイックチュートリアル/リフレッシュ で、FastAPIでそれらを使用するために必要な最低限のことだけをカバーしています。...実際には本当に少ないです。

FastAPI はすべてこれらの型ヒントに基づいており、多くの強みと利点を与えてくれます。

しかしたとえまったく FastAPI を使用しない場合でも、それらについて少し学ぶことで利点を得ることができるでしょう。

/// note | "備考"

もしあなたがPythonの専門家で、すでに型ヒントについてすべて知っているのであれば、次の章まで読み飛ばしてください。

///

動機

簡単な例から始めてみましょう:

{!../../../docs_src/python_types/tutorial001.py!}

このプログラムを実行すると以下が出力されます:

John Doe

この関数は以下のようなことを行います:

  • first_namelast_nameを取得します。
  • title()を用いて、それぞれの最初の文字を大文字に変換します。
  • 真ん中にスペースを入れて連結します。
{!../../../docs_src/python_types/tutorial001.py!}

編集

これはとても簡単なプログラムです。

しかし、今、あなたがそれを一から書いていたと想像してみてください。

パラメータの準備ができていたら、そのとき、関数の定義を始めていたことでしょう...

しかし、そうすると「最初の文字を大文字に変換するあのメソッド」を呼び出す必要があります。

それはupperでしたか?uppercaseでしたか?それともfirst_uppercase?またはcapitalize

そして、古くからプログラマーの友人であるエディタで自動補完を試してみます。

関数の最初のパラメータfirst_nameを入力し、ドット(.)を入力してから、Ctrl+Spaceを押すと補完が実行されます。

しかし、悲しいことに、これはなんの役にも立ちません:

型の追加

先ほどのコードから一行変更してみましょう。

以下の関数のパラメータ部分を:

    first_name, last_name

以下へ変更します:

    first_name: str, last_name: str

これだけです。

それが「型ヒント」です:

{!../../../docs_src/python_types/tutorial002.py!}

これは、以下のようにデフォルト値を宣言するのと同じではありません:

    first_name="john", last_name="doe"

それとは別物です。

イコール(=)ではなく、コロン(:)を使用します。

そして、通常、型ヒントを追加しても、それらがない状態と起こることは何も変わりません。

しかし今、あなたが再びその関数を作成している最中に、型ヒントを使っていると想像してみて下さい。

同じタイミングでCtrl+Spaceで自動補完を実行すると、以下のようになります:

これであれば、あなたは「ベルを鳴らす」一つを見つけるまで、オプションを見て、スクロールすることができます:

より強い動機

この関数を見てください。すでに型ヒントを持っています:

{!../../../docs_src/python_types/tutorial003.py!}

エディタは変数の型を知っているので、補完だけでなく、エラーチェックをすることもできます。

これでagestr(age)で文字列に変換して修正する必要があることがわかります:

{!../../../docs_src/python_types/tutorial004.py!}

型の宣言

関数のパラメータとして、型ヒントを宣言している主な場所を確認しました。

これは FastAPI で使用する主な場所でもあります。

単純な型

strだけでなく、Pythonの標準的な型すべてを宣言することができます。

例えば、以下を使用可能です:

  • int
  • float
  • bool
  • bytes
{!../../../docs_src/python_types/tutorial005.py!}

型パラメータを持つジェネリック型

データ構造の中には、dictlistset、そしてtupleのように他の値を含むことができるものがあります。また内部の値も独自の型を持つことができます。

これらの型や内部の型を宣言するには、Pythonの標準モジュールtypingを使用します。

これらの型ヒントをサポートするために特別に存在しています。

List

例えば、strlistの変数を定義してみましょう。

typingからListをインポートします(大文字のLを含む):

{!../../../docs_src/python_types/tutorial006.py!}

同じようにコロン(:)の構文で変数を宣言します。

型として、Listを入力します。

リストはいくつかの内部の型を含む型なので、それらを角括弧で囲んでいます。

{!../../../docs_src/python_types/tutorial006.py!}

/// tip | "豆知識"

角括弧内の内部の型は「型パラメータ」と呼ばれています。

この場合、strListに渡される型パラメータです。

///

つまり: 変数itemslistであり、このリストの各項目はstrです。

そうすることで、エディタはリストの項目を処理している間にもサポートを提供できます。

タイプがなければ、それはほぼ不可能です。

変数itemはリストitemsの要素の一つであることに注意してください。

それでも、エディタはそれがstrであることを知っていて、そのためのサポートを提供しています。

TupleSet

tuplesetの宣言も同様です:

{!../../../docs_src/python_types/tutorial007.py!}

つまり:

  • 変数items_tintintstrの3つの項目を持つtupleです

  • 変数items_sはそれぞれの項目がbytes型であるsetです。

Dict

dictを宣言するためには、カンマ区切りで2つの型パラメータを渡します。

最初の型パラメータはdictのキーです。

2番目の型パラメータはdictの値です。

{!../../../docs_src/python_types/tutorial008.py!}

つまり:

  • 変数pricesdictであり:
    • このdictのキーはstr型です。(つまり、各項目の名前)
    • このdictの値はfloat型です。(つまり、各項目の価格)

Optional

また、Optionalを使用して、変数がstrのような型を持つことを宣言することもできますが、それは「オプション」であり、Noneにすることもできます。

{!../../../docs_src/python_types/tutorial009.py!}

ただのstrの代わりにOptional[str]を使用することで、エディタは値が常にstrであると仮定している場合に実際にはNoneである可能性があるエラーを検出するのに役立ちます。

ジェネリック型

以下のように角括弧で型パラメータを取る型を:

  • List
  • Tuple
  • Set
  • Dict
  • Optional
  • ...など

ジェネリック型 または ジェネリクス と呼びます。

型としてのクラス

変数の型としてクラスを宣言することもできます。

例えば、Personクラスという名前のクラスがあるとしましょう:

{!../../../docs_src/python_types/tutorial010.py!}

変数の型をPersonとして宣言することができます:

{!../../../docs_src/python_types/tutorial010.py!}

そして、再び、すべてのエディタのサポートを得ることができます:

Pydanticのモデル

Pydantic はデータ検証を行うためのPythonライブラリです。

データの「形」を属性付きのクラスとして宣言します。

そして、それぞれの属性は型を持ちます。

さらに、いくつかの値を持つクラスのインスタンスを作成すると、その値を検証し、適切な型に変換して(もしそうであれば)全てのデータを持つオブジェクトを提供してくれます。

また、その結果のオブジェクトですべてのエディタのサポートを受けることができます。

Pydanticの公式ドキュメントから引用:

{!../../../docs_src/python_types/tutorial011.py!}

/// info | "情報"

Pydanticについてより学びたい方はドキュメントを参照してください.

///

FastAPI はすべてPydanticをベースにしています。

すべてのことはチュートリアル - ユーザーガイド{.internal-link target=_blank}で実際に見ることができます。

FastAPIでの型ヒント

FastAPI はこれらの型ヒントを利用していくつかのことを行います。

FastAPI では型ヒントを使って型パラメータを宣言すると以下のものが得られます:

  • エディタサポート.
  • 型チェック.

...そして FastAPI は同じように宣言をすると、以下のことを行います:

  • 要件の定義: リクエストパスパラメータ、クエリパラメータ、ヘッダー、ボディ、依存関係などから要件を定義します。
  • データの変換: リクエストのデータを必要な型に変換します。
  • データの検証: リクエストごとに:
    • データが無効な場合にクライアントに返される 自動エラー を生成します。
  • ドキュメント OpenAPIを使用したAPI:
    • 自動的に対話型ドキュメントのユーザーインターフェイスで使用されます。

すべてが抽象的に聞こえるかもしれません。心配しないでください。 この全ての動作は チュートリアル - ユーザーガイド{.internal-link target=_blank}で見ることができます。

重要なのは、Pythonの標準的な型を使うことで、(クラスやデコレータなどを追加するのではなく)1つの場所で FastAPI が多くの作業を代わりにやってくれているということです。

/// info | "情報"

すでにすべてのチュートリアルを終えて、型についての詳細を見るためにこのページに戻ってきた場合は、mypyのチートシートを参照してください

///