Python 3.6以降 では「型ヒント」オプションがサポートされています。
これらの "型ヒント" は変数の型を宣言することができる新しい構文です。(Python 3.6以降)
変数に型を宣言することでエディターやツールがより良いサポートを提供することができます。
ここではPythonの型ヒントについての クイックチュートリアル/リフレッシュ で、FastAPIでそれらを使用するために必要な最低限のことだけをカバーしています。...実際には本当に少ないです。
FastAPI はすべてこれらの型ヒントに基づいており、多くの強みと利点を与えてくれます。
しかしたとえまったく FastAPI を使用しない場合でも、それらについて少し学ぶことで利点を得ることができるでしょう。
/// note | "備考"
もしあなたがPythonの専門家で、すでに型ヒントについてすべて知っているのであれば、次の章まで読み飛ばしてください。
///
簡単な例から始めてみましょう:
{!../../../docs_src/python_types/tutorial001.py!}このプログラムを実行すると以下が出力されます:
John Doe
この関数は以下のようなことを行います:
first_nameとlast_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!}エディタは変数の型を知っているので、補完だけでなく、エラーチェックをすることもできます。
これでageをstr(age)で文字列に変換して修正する必要があることがわかります:
{!../../../docs_src/python_types/tutorial004.py!}関数のパラメータとして、型ヒントを宣言している主な場所を確認しました。
これは FastAPI で使用する主な場所でもあります。
strだけでなく、Pythonの標準的な型すべてを宣言することができます。
例えば、以下を使用可能です:
intfloatboolbytes
{!../../../docs_src/python_types/tutorial005.py!}データ構造の中には、dict、list、set、そしてtupleのように他の値を含むことができるものがあります。また内部の値も独自の型を持つことができます。
これらの型や内部の型を宣言するには、Pythonの標準モジュールtypingを使用します。
これらの型ヒントをサポートするために特別に存在しています。
例えば、strのlistの変数を定義してみましょう。
typingからListをインポートします(大文字のLを含む):
{!../../../docs_src/python_types/tutorial006.py!}同じようにコロン(:)の構文で変数を宣言します。
型として、Listを入力します。
リストはいくつかの内部の型を含む型なので、それらを角括弧で囲んでいます。
{!../../../docs_src/python_types/tutorial006.py!}/// tip | "豆知識"
角括弧内の内部の型は「型パラメータ」と呼ばれています。
この場合、strはListに渡される型パラメータです。
///
つまり: 変数itemsはlistであり、このリストの各項目はstrです。
そうすることで、エディタはリストの項目を処理している間にもサポートを提供できます。
タイプがなければ、それはほぼ不可能です。
変数itemはリストitemsの要素の一つであることに注意してください。
それでも、エディタはそれがstrであることを知っていて、そのためのサポートを提供しています。
tupleとsetの宣言も同様です:
{!../../../docs_src/python_types/tutorial007.py!}つまり:
-
変数
items_tはint、int、strの3つの項目を持つtupleです -
変数
items_sはそれぞれの項目がbytes型であるsetです。
dictを宣言するためには、カンマ区切りで2つの型パラメータを渡します。
最初の型パラメータはdictのキーです。
2番目の型パラメータはdictの値です。
{!../../../docs_src/python_types/tutorial008.py!}つまり:
- 変数
pricesはdictであり:- この
dictのキーはstr型です。(つまり、各項目の名前) - この
dictの値はfloat型です。(つまり、各項目の価格)
- この
また、Optionalを使用して、変数がstrのような型を持つことを宣言することもできますが、それは「オプション」であり、Noneにすることもできます。
{!../../../docs_src/python_types/tutorial009.py!}ただのstrの代わりにOptional[str]を使用することで、エディタは値が常にstrであると仮定している場合に実際にはNoneである可能性があるエラーを検出するのに役立ちます。
以下のように角括弧で型パラメータを取る型を:
ListTupleSetDictOptional- ...など
ジェネリック型 または ジェネリクス と呼びます。
変数の型としてクラスを宣言することもできます。
例えば、Personクラスという名前のクラスがあるとしましょう:
{!../../../docs_src/python_types/tutorial010.py!}変数の型をPersonとして宣言することができます:
{!../../../docs_src/python_types/tutorial010.py!}そして、再び、すべてのエディタのサポートを得ることができます:
Pydantic はデータ検証を行うためのPythonライブラリです。
データの「形」を属性付きのクラスとして宣言します。
そして、それぞれの属性は型を持ちます。
さらに、いくつかの値を持つクラスのインスタンスを作成すると、その値を検証し、適切な型に変換して(もしそうであれば)全てのデータを持つオブジェクトを提供してくれます。
また、その結果のオブジェクトですべてのエディタのサポートを受けることができます。
Pydanticの公式ドキュメントから引用:
{!../../../docs_src/python_types/tutorial011.py!}/// info | "情報"
Pydanticについてより学びたい方はドキュメントを参照してください.
///
FastAPI はすべてPydanticをベースにしています。
すべてのことはチュートリアル - ユーザーガイド{.internal-link target=_blank}で実際に見ることができます。
FastAPI はこれらの型ヒントを利用していくつかのことを行います。
FastAPI では型ヒントを使って型パラメータを宣言すると以下のものが得られます:
- エディタサポート.
- 型チェック.
...そして FastAPI は同じように宣言をすると、以下のことを行います:
- 要件の定義: リクエストパスパラメータ、クエリパラメータ、ヘッダー、ボディ、依存関係などから要件を定義します。
- データの変換: リクエストのデータを必要な型に変換します。
- データの検証: リクエストごとに:
- データが無効な場合にクライアントに返される 自動エラー を生成します。
- ドキュメント OpenAPIを使用したAPI:
- 自動的に対話型ドキュメントのユーザーインターフェイスで使用されます。
すべてが抽象的に聞こえるかもしれません。心配しないでください。 この全ての動作は チュートリアル - ユーザーガイド{.internal-link target=_blank}で見ることができます。
重要なのは、Pythonの標準的な型を使うことで、(クラスやデコレータなどを追加するのではなく)1つの場所で FastAPI が多くの作業を代わりにやってくれているということです。
/// info | "情報"
すでにすべてのチュートリアルを終えて、型についての詳細を見るためにこのページに戻ってきた場合は、mypyのチートシートを参照してください
///





