新しくリリースされたPython 3.8には、新しい型注釈 typing.TypedDict
があります。そのドキュメントには、
イントロスペクションのタイプ情報には、
Point2D.__annotations__
およびPoint2D.__total__
を介してアクセスできます。 [....]
__annotations__
はよく知られていますが、 PEP 3107 で導入されましたが、__total__
に関する情報は見つかりません。誰かがその意味を説明し、可能であれば信頼できる情報源にリンクすることはできますか?
TypedDict
はPython 3.8 PEP 589 で受け入れられました。Pythonからは、__total__
はTrue
デフォルトでは:
tot = TypedDict.__total__
print(type(tot))
print(tot)
# <class 'bool'>
# True
他の投稿で述べたように、このメソッドの詳細は docs で制限されていますが、@-Yann Vernierの CPythonソースコード へのリンクは、__total__
が新しいtotal
キーワード Python 3.8で導入 :
# cypthon/typing.py
class _TypedDictMeta(type):
def __new__(cls, name, bases, ns, total=True):
"""Create new typed dict class object.
...
"""
...
if not hasattr(tp_dict, '__total__'):
tp_dict.__total__ = total
...
それはどのように機能しますか?
概要:デフォルトでは、定義されたTypedDict
をインスタンス化するときにすべてのキーが必要です。 total=False
はこの制限を無効にし、オプションのキーを許可します。次のデモをご覧ください。
与えられた
テストディレクトリツリー:
コード
テストディレクトリ内のファイル:
# rgb_bad.py
from typing import TypedDict
class Color(TypedDict):
r: int
g: int
b: int
a: float
blue = Color(r=0, g=0, b=255) # missing "a"
# rgb_good.py
from typing import TypedDict
class Color(TypedDict, total=False):
r: int
g: int
b: int
a: float
blue = Color(r=0, g=0, b=255) # missing "a"
デモ
キーがない場合、mypyはコマンドラインで文句を言うでしょう:
> mypy code/rgb_bad.py
code\rgb_bad.py:11: error: Key 'a' missing for TypedDict "Color"
...
total=False
を設定すると、オプションのキーが許可されます。
> mypy code/rgb_good.py
Success: no issues found in 1 source file
関連項目
TypedDict
in Python 3.8 by Real Pythontyping-extensions
パッケージTypedDict
を使用するにはPython 3.5、3.6