web-dev-qa-db-ja.com

Python 3の__total__ dunder属性の意味は何ですか?

新しくリリースされたPython 3.8には、新しい型注釈 typing.TypedDict があります。そのドキュメントには、

イントロスペクションのタイプ情報には、Point2D.__annotations__およびPoint2D.__total__を介してアクセスできます。 [....]

__annotations__はよく知られていますが、 PEP 3107 で導入されましたが、__total__に関する情報は見つかりません。誰かがその意味を説明し、可能であれば信頼できる情報源にリンクすることはできますか?

17
Antti Haapala

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はこの制限を無効にし、オプションのキーを許可します。次のデモをご覧ください。

与えられた

テストディレクトリツリー:

enter image description here

コード

テストディレクトリ内のファイル:

# 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

関連項目

1
pylang