1. ホーム
  2. python

[解決済み] 変数アノテーションとは何ですか?

2022-10-15 20:42:16

質問

Python 3.6がリリースされるようです。 PEP 494 -- Python 3.6 リリーススケジュール が12月末に言及してるので、一通り Python 3.6 の新機能について を読んでみると 変数アノテーション :

PEP 484 は、関数パラメータの型アノテーション(別名、型ヒント)の標準を導入しました。この PEP はクラス変数とインスタンス変数を含む変数の型を注釈するための構文を Python に追加します。

primes: List[int] = []

captain: str  # Note: no initial value!

class Starship:
     stats: Dict[str, int] = {}

関数アノテーションと同様に、Pythonインタープリタは変数アノテーションに特別な意味を持たせず、特殊な属性である __annotations__ に格納するだけです。静的型付け言語における変数宣言とは対照的に、アノテーション構文の目標は、抽象構文木と __annotations__ 属性を通じて、サードパーティのツールやライブラリに構造化された型メタデータを簡単に指定できるようにすることです。

私が読んだところでは、これらは Python 3.5 から来る型ヒントの一部であり、次のように説明されています。 Python 3.5 の Type hints とは何ですか? .

私は captain: strclass Starship の例がありますが、最後の例はよくわかりません。どのように primes: List[int] = [] はどのように説明するのでしょうか?それは、整数だけを許可する空のリストを定義しているのでしょうか?

どのように解決するのですか?

の間にあるものはすべて := はタイプヒントなので primes は確かに List[int] であり、初期状態では空リストが設定されています(そして stats は初期状態では空の辞書であり、次のように定義されます。 Dict[str, int] ).

List[int]Dict[str, int] は次の構文の一部ではありませんが、これらは Python 3.5 typing hints PEP で既に定義されていました。3.6 の PEP 526 - 変数アノテーションのための構文 提案 のみ は、変数に同じヒントを付けるための構文を定義します。以前は、コメント付きの変数にしか型ヒントを付けられませんでした(例えば primes = [] # List[int] ).

どちらも ListDict 一般的な 型であり、特定の(具体的な)内容を持つリストまたは辞書のマッピングを持っていることを示します。

については List では、「引数」は一つしかありません。 [...] 構文の要素)、リストの各要素の型です。例えば Dict の場合、最初の引数はキーの型、2番目の引数は値の型です。つまり すべて の値は primes のリストは整数であり すべて のキー・バリュー・ペアは stats 辞書にあるすべてのキーと値のペアは (str, int) のペアで、文字列と整数を対応させます。

を参照してください。 typing.List typing.Dict の定義では セクションの ジェネリックス と同様に PEP 483 - タイプヒントの理論 .

関数の型ヒントと同様に、その使用は任意であり、また、そのような型ヒントは アノテーション とみなされます (これを付けるオブジェクトがある場合、モジュールではグローバル、クラスでは属性ですが、関数ではローカルではありません)。 __annotations__ 属性で調べることができます。これらのアノテーションには任意の情報を付けることができ、タイプヒント情報に厳密に制限されることはありません。

を読みたいと思うかもしれません。 提案書全文 それは、そのようなアノテーションがいつ評価されるか、どのようにそれらをイントロスペクトするか、そして、例えば、何かをクラス属性対インスタンス属性として宣言する方法を指定するものです。