Python3.6の概要(その2 - 変数アノテーション)
変数アノテーション
PEP 484 -- Type Hintsで導入された型ヒントが、モジュールのグローバル変数や、クラスのインスタンス変数などにも指定できるようになった。PEP 526 -- Syntax for Variable Annotations
変数の型アノテーションは、mypy などではコメントとして指定するようになっていたが、Python3.6以降では、正式なPythonの構文で指定できるようになった。
>>> SPAM:str = 'global spam string' # SPAM は str型グローバル変数 >>> class Ham: ... EGG: int = 100 # EGGはint型クラス変数
この例では、代入文で変数を作成するのと同時に型を宣言しているが、変数の値を指定せずに、変数の型だけでも宣言できる。この場合は代入文では使用せずに、
>>> SPAM:str # SPAM は str型グローバル変数 >>> class Spam: num: int # Spam.numはint型
と指定する。デフォルト値の存在しない、クラスのメンバ変数などはこの形式で指定すると良いだろう。
値を指定せずに型だけを指定した場合、変数としては存在しないので実際に代入するまでは参照できない。
>>> HAM:int # HAMの型宣言。宣言だけで、まだ変数は作成されていない >>> print(HAM) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'HAM' is not defined >>> HAM = 100 # 代入文で変数名を作成 >>> print(HAM) 100
指定した型情報は、モジュールやクラスの__annotations__
メンバ変数で参照できる。
>>> class Egg: ... num: int ... >>> Egg.__annotations__ {'num': <class 'int'>}
関数内でローカル変数にアノテーションを指定してもエラーとはならないが、指定した結果はどこにも格納されていないようだ。ローカル変数のアノテーションは、単に無視されるだけようだ。