このBlogは移転しました。今後は aish.dev を御覧ください。

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'>}

関数内でローカル変数にアノテーションを指定してもエラーとはならないが、指定した結果はどこにも格納されていないようだ。ローカル変数のアノテーションは、単に無視されるだけようだ。