変数アノテーションとは何ですか?
変数アノテーションは# type
、PEP 484
;で定義されているように、コメントの次のステップにすぎません。この変更の背後にある理論的根拠は、PEP526のそれぞれのセクションで強調されています。
したがって、タイプをヒントにする代わりに、次のようにします。
primes = []
次の形式の割り当てで型に直接注釈を付けることができるように、新しい構文が導入されました。
primes: List[int] = []
@Martijnが指摘したように、これはで使用可能な型を使用して整数のリストを示し、typing
それを空のリストに初期化します。
それはどのような変化をもたらしますか?
導入された最初の変更は、文字の後にスタンドアロンで、またはオプションで値を割り当てながら注釈を付けることができる、タイプで名前に注釈を付けることができる新しい構文でし:
た。
annotated_assignment_stmt ::= augtarget ":" expression ["=" expression]
したがって、問題の例:
primes: List[int] = [ ]
新しい構文とともに、追加の変更も導入されました。モジュールとクラスには、タイプメタデータが添付さ__annotations__
れた属性があります(PEP 3107以降の関数のように-関数アノテーション)。
from typing import get_type_hints
現在__main__.__annotations__
、宣言されたタイプを保持しています。
>>> from typing import List, get_type_hints
>>> primes: List[int] = []
>>> captain: str
>>> import __main__
>>> get_type_hints(__main__)
{'primes': typing.List<~T>[int]}
captain
モジュールでもアクセスできるタイプのみが返されるget_type_hints
ため、現在は表示されませんget_type_hints
。つまり、最初に値が必要です。
>>> captain = "Picard"
>>> get_type_hints(__main__)
{'primes': typing.List<~T>[int], 'captain': <class 'str'>}
を使用print(__annotations__)
すると表示され'captain': <class 'str'>
ますが、__annotations__
直接アクセスするべきではありません。
同様に、クラスの場合:
>>> get_type_hints(Starship)
ChainMap({'stats': typing.Dict<~KT, ~VT>[str, int]}, {})
ここで、aChainMap
は、特定のクラス(最初のマッピングにある)のアノテーションと、そのクラスmro
(結果として生じるマッピング、{}
オブジェクト)にある基本クラスで定義されているすべてのアノテーションを取得するために使用されます。
新しい構文にClassVar
加えて、クラス変数を示す新しいタイプが追加されました。うん、stats
あなたの例では、実際にはインスタンス変数であり、ではありませんClassVar
。
使用を余儀なくされますか?
からの型ヒントと同様にPEP 484
、これらは完全にオプションであり、型チェックツール(およびこの情報に基づいて構築できるその他のもの)に主に使用されます。Python 3.6の安定バージョンがリリースされたときに暫定的になるため、将来的に小さな調整が追加される可能性があります。
primes: List[int] = []
は空のリストprimes = []
です。違いは、あなたがしていることであると主張していることprimes
を意図しているだけ含まれているint
Sとサードパーティのアプリケーションは、この主張を検証するために、あなたのプログラムを確認してください入力かもしれませんが、あなただけの書き込みと同じだ任意のPythonインタプリタ内のコードを実行するとprimes = []
、したがって、やってはprimes: List[int] = []; primes.append("string")
まだあります有効です。