파이썬 3에서 __total__ dunder 속성의 의미는 무엇입니까?


17

새로 출시 된 Python 3.8에는 새로운 유형 주석이 typing.TypedDict있습니다. 그것의 문서는 언급

반성의 타입 정보는 통해 액세스 할 수 있습니다 Point2D.__annotations__Point2D.__total__. [....]

PEP 3107__annotations__ 에 소개 된 잘 알려져 있지만 에 대한 정보를 찾을 수 없습니다 . 누구나 그 의미를 설명하고 가능한 경우 권위있는 출처에 연결 할 수 있습니까?__total__


4
전형적인. typing내부의 99 %는 문서화되지 않았으며 문서화되지 않은 부분은 문서화되지 않았습니다.
Aran-Fey

답변:


3

__total__필드는 인스턴스가 완전 해야하는지 (기본값) 아닌지 (모든 필드는 선택 사항)를 나타냅니다. 나는 PEP 589 에서 검색을 시작 했는데, 그 TypedDict전체 를 소개 하고 설명합니다. 구문을 total위해 Dunder-style의 이름을 바꾸는 것이 합리적 인 인수를 사용했습니다 class. 그러나 언제 그런 이름이 바뀌 었는지 찾지 못했습니다.

이러한 주석을 처리하는 실제 유형 검사기 인 MyPy를 살펴보면 비슷한 문서 TypedDict와 totality 가 있지만 dunder 구문에 대한 참조는 없습니다. 로 더 많은 혼란을 주도 구현에 파고 TypedDictTypetypes.py가에서 총 필드가 있지만 분리되지 않습니다 itemsrequired_keys. 전체 성은 암시 items.keys()==required_keys하지만 구현은 단독 can_be_false의존 과 같은 다른 가정을 items합니다. total=False원칙적으로 평균 required_keys은 비어 있어야합니다.

_TypedDictMeta 에 대한 CPython 소스 는 최소한 total인수와 __total__던더가 동일하고 동일 하다는 것을 보여줍니다 TypedDict.


지금 당장 받아들이십시오. 다른 것이 아니라면 다른 사람들이 더 기꺼이 앞으로 나아와 당신의 대답을 반박하게 될 것입니다 : D
Antti Haapala

필자는 개인적 can_be_false으로 MyPy 버그로 의심 되며, 처음부터 옵션 필드를 계획하지 않았을 가능성이 있습니다.
Yann Vernier

1

TypedDictPython 3.8에서는 PEP 589 를 통해 허용되었습니다 . 파이썬에서는 기본적으로 __total__부울 플래그로 설정되어 있습니다 True.

tot = TypedDict.__total__
print(type(tot))
print(tot)

# <class 'bool'>
# True

다른 게시물에서 언급 했듯이이 방법에 대한 세부 사항은 docs 에서는 제한적 이지만 CPYthon 소스 코드 에 대한 @Yann Vernier의 링크 는 Python 3.8에 도입 된__total__ 새로운 total키워드 와 관련이 있음을 강력히 제안합니다 .

# 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

또한보십시오

  • 전체를 보여주는 R. Hettinger의 트윗
  • PEP 589의 전체 PEP 섹션
  • 기사 섹션 유형에 대한과 TypedDict실제 파이썬으로 파이썬 3.8
  • typing-extensionsTypedDictPython 3.5, 3.6에서 사용할 패키지
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.