Python は動的言語であり、使用前に変数を宣言する必要がなく、あらゆるタイプのオブジェクトを指すことができます。Python は開発者に利便性をもたらす一方で、IDE やコード リーダーに混乱をもたらします。不明なケースでは、IDE は完了プロンプトや構文チェックを提供できません。
Python はバージョン 3.5 から「型ヒント」(PEP484) をサポートし、開発者が変数の型を宣言できるようにします。
型ヒントの最大の利点は、IDE が対応する型の補完ヒントを提供できることです。
- 型ヒントはありません
VSCode はパラメータのタイプを認識できないため、完了プロンプトを表示できません
- 型ヒントがある場合
VSCode は文字列型であることを認識しており、文字列のすべてのメソッドをリストできます。
型ヒントを使用する
型ヒントはヒントとしてのみ機能し、コードの実行には影響しません。変数の実際の型は型ヒントとは異なる場合があります。
型のヒントには、変数の型、関数のパラメータの型、戻り値の型が含まれます。
- 変数の型を宣言する
sep: str
sep = '-'
age: int = 35
ok: bool = True
pi: float = 3.14159
変数は、最初に型を宣言してから値を割り当てることも、型を宣言して同時に値を割り当てることもできます。
- 関数のパラメータと戻り値の型を宣言します。
Python インタープリターは関数の型ヒントを解析し、関数オブジェクトの __annotations__ 属性を更新します。
def get_name(f_name: str, l_name: str, sep: str = '-') -> str:
name = f_name.title() + sep + l_name.title()
return name
class Cat:
def __init__(self, name):
self.name = name
def do(self, content: str) -> str:
return f"{
self.name} do {
content}"
print("get_name type-hints:", get_name.__annotations__)
print("Cat.do type-hints:", Cat.do.__annotations__)
デフォルト値を持つパラメータの場合は、タイプヒントの後にデフォルト値を置きます。
出力:
get_name type-hints: {'f_name': <class 'str'>, 'l_name': <class 'str'>, 'sep': <class 'str'>, 'return': <class 'str'>}
Cat.do type-hints: {'content': <class 'str'>, 'return': <class 'str'>}
利用可能なタイプ
型自体を使用することに加えて、型ヒントでは型の文字列も使用できます。
def show(name: 'str', age: 'int') -> 'None':
print("name:", name)
print("age :", age)
コンテナの種類
基本タイプに加えて、コンテナタイプではサブ要素のタイプも指定できるため、サブ要素が使用される場合、IDE はコード補完も提供できます。
from typing import Tuple
Vector2D = Tuple[int, int]
def show(line: list[int], dots: Vector2D, info: dict[str, str]):
print('line:', line)
print('dots:', dots)
print('info:', info)
show([1], (2, 3), {
'name': 'Hoss'})
コンテナ内の子要素のタイプを指定するには、次の 2 つの方法があります。
- 組み込みのコンテナタイプを直接使用する
list[int]
たとえばdict[str, str]
、 と は Python 3.9 以降でのみ利用可能です
- 標準ライブラリの助けを借りて
typing
たとえばTuple[int, int]
、使用法は上記と同じですが、対応するタイプのエイリアスに置き換えるだけです。
もちろん、カスタム コンテナ タイプを変数に割り当てることもできます。これはタイプ ヒントに使用されます。