Python Language
タイプヒント
サーチ…
構文
- typing.Callable [[int、str]、None] - > def func(a:int、b:str) - >なし
- マッピング[str、int] - > {"a":1、 "b":2、 "c":3}
- typing.List [int] - > [1、2、3]
- typing.Set [int] - > {1,2,3}
- typing.Optional [int] - >なしまたはint
- シーケンス[int] - > [1,2,3]または(1,2,3)を入力します。
- typing.Any - >任意の型
- typing.Union [int、str] - > 1または "1"
- T = typing.TypeVar( 'T') - >汎用型
備考
タイプヒントは、 PEP 484
で指定されているように、Pythonコードの値の型を静的に示す正式なソリューションです。タイプヒントは、 typing
モジュールの横に表示されることにより、Pythonユーザにコードに注釈を付ける機能を提供し、タイプチェッカーを支援しながら、間接的にコードに詳細情報を記述します。
一般的なタイプ
typing.TypeVar
はジェネリック型のファクトリです。主な目的は、ジェネリック関数/クラス/メソッドアノテーションのパラメータ/プレースホルダとして機能することです。
import typing
T = typing.TypeVar("T")
def get_first_element(l: typing.Sequence[T]) -> T:
"""Gets the first element of a sequence."""
return l[0]
関数に型を追加する
2つの引数を受け取り、その合計を示す値を返す関数の例を見てみましょう:
def two_sum(a, b):
return a + b
このコードを見ることで、関数two_sum
引数の型を安全かつtwo_sum
示すことはできません。 int
値を指定すると、両方とも動作します:
print(two_sum(2, 1)) # result: 3
と文字列で:
print(two_sum("a", "b")) # result: "ab"
list
やtuple
などの他の値と比較します。
このようなPython型の動的な性質のために、与えられた操作に多くのものが適用される場合、どの型チェッカーでもこの関数の呼び出しを許可するかどうかを合理的に宣言できません。
型チェッカーを助けるために、私たちが許可する型を示す関数定義の型ヒントを提供できるようになりました。
int
型のみを許可することを示すために、関数定義を次のように変更することができます。
def two_sum(a: int, b: int):
return a + b
アノテーションは引数名の後に記述され、a :
文字で区切られます。
同様に、 str
型のみが許可されていることを示すために、関数を変更して型を指定します。
def two_sum(a: str, b: str):
return a + b
引数の型を指定するだけでなく、関数呼び出しの戻り値を示すこともできます。これは、引数リストの中の閉じ括弧の後の->
文字の後に型を追加することによって行われますが 、関数宣言の最後には:
前に:
def two_sum(a: int, b: int) -> int:
return a + b
ここで、 two_sum
を呼び出すときの戻り値はint
型でなければならないことを示しました。同様に、 str
、 float
、 list
、 set
などの適切な値を定義できます。
型ヒントはほとんどが型チェッカーやIDEで使用されますが、それらを取得する必要があることがあります。これは__annotations__
特殊属性を使用して行うことができます:
two_sum.__annotations__
# {'a': <class 'int'>, 'b': <class 'int'>, 'return': <class 'int'>}
クラスメンバーとメソッド
class A:
x = None # type: float
def __init__(self, x: float) -> None:
"""
self should not be annotated
init should be annotated to return None
"""
self.x = x
@classmethod
def from_int(cls, x: int) -> 'A':
"""
cls should not be annotated
Use forward reference to refer to current class with string literal 'A'
"""
return cls(float(x))
関数が定義されたときにアノテーションが評価されるので、現在のクラスの前方参照が必要です。前方参照は、インポートされた場合に循環インポートを引き起こすクラスを参照するときにも使用できます。
変数と属性
変数には注釈を使用して注釈が付けられます。
x = 3 # type: int
x = negate(x)
x = 'a type-checker might catch this error'
Python 3.6から、変数注釈の新しい構文もあります 。上記のコードはフォームを使用するかもしれません
x: int = 3
コメントとは異なり、値を設定せずに、以前に宣言されていない変数に型ヒントを追加することもできます。
y: int
さらに、これらがモジュールまたはクラスレベルで使用されている場合は、 typing.get_type_hints(class_or_module)
を使用してタイプヒントを取得できます。
class Foo:
x: int
y: str = 'abc'
print(typing.get_type_hints(Foo))
# ChainMap({'x': <class 'int'>, 'y': <class 'str'>}, {})
あるいは、 __annotations__
特殊変数または属性を使用してアクセスすることもできます。
x: int
print(__annotations__)
# {'x': <class 'int'>}
class C:
s: str
print(C.__annotations__)
# {'s': <class 'str'>}
NamedTuple
型ヒント付きの名前付きタプルの作成は、型typing
モジュールのNamedTuple関数を使って行います:
import typing
Point = typing.NamedTuple('Point', [('x', int), ('y', int)])
結果の型の名前は関数の最初の引数ですが、型チェッカーの作業を容易にするために同じ名前の変数に割り当てる必要があります。
キーワード引数のタイプヒント
def hello_world(greeting: str = 'Hello'):
print(greeting + ' world!')
キーワード引数が通常どのようにスタイルされているかとは対照的に、等号の周りのスペースに注意してください。