W nowo wydanym Pythonie 3.8 dostępna jest adnotacja nowego typu typing.TypedDict
. Dokumentacja wspomina o tym
Informacje o typie introspekcji można uzyskać za pomocą
Point2D.__annotations__
iPoint2D.__total__
. [....]
Chociaż __annotations__
jest dobrze znany, po wprowadzeniu do PEP 3107 , nie mogę znaleźć żadnych informacji na jego temat __total__
. Czy ktoś mógłby wyjaśnić jego znaczenie i, jeśli to możliwe, link do wiarygodnych źródeł?
python
python-3.x
python-typing
Antti Haapala
źródło
źródło
typing
wewnętrznych nie jest udokumentowane, a część, która jest udokumentowana słabo.Odpowiedzi:
Zgaduję, że
__total__
pole wskazuje, czy instancje muszą być kompletne (domyślne), czy nie (wszystkie pola opcjonalne). Rozpocząłem wyszukiwanie w PEP 589 , który wprowadziłTypedDict
i opisuje całość jako taką. Użyłtotal
argumentu, który miałoby sens zmienić nazwę składni dla stylu dunderaclass
. Nie znalazłem jednak, kiedy taka zmiana nazwy miała miejsce.Patrząc na MyPy, który jest prawdziwym narzędziem do sprawdzania typów, który dba o te adnotacje, istnieje podobna dokumentacja
TypedDict
i całość , ale znowu nie ma odniesienia do składni dundera. Zagłębianie się w jego implementację doprowadziło do większej dezorientacji, ponieważTypedDictType
w pliku types.py nie ma pola całkowitego, ale oddzielneitems
irequired_keys
. Totality implikuje to,items.keys()==required_keys
ale implementacja przyjmuje różne założenia, na przykładcan_be_false
poleganieitems
wyłącznie na sobie.total=False
powinno w zasadzie oznaczać, żerequired_keys
jest puste.Źródło CPython dla _TypedDictMeta przynajmniej ujawnia, że
total
argument i__total__
dunder są jednym i tym samym, chociaż źródło opisujeTypedDict
się jako „może zostać dodane wkrótce”.źródło
can_be_false
jest to błąd MyPy, prawdopodobnie związany z tym, że od początku nie planowałem mieć opcjonalnych pól.TypedDict
został zaakceptowany w Pythonie 3.8 przez PEP 589 . Z Python wygląda na__total__
to, że flaga logiczna jest ustawionaTrue
domyślnie na:Jak wspomniano w innych postach, szczegółowe informacje na temat tej metody są ograniczone w dokumentach , ale link @ Yanna Verniera do kodu źródłowego CPython zdecydowanie sugeruje, że
__total__
jest powiązany z nowymtotal
słowem kluczowym wprowadzonym w Pythonie 3.8 :Jak to działa?
Streszczenie : domyślnie wszystkie klucze są wymagane przy tworzeniu zdefiniowanej instancji
TypedDict
.total=False
zastępuje to ograniczenie i zezwala na klucze opcjonalne. Zobacz następującą demonstrację.Dany
Testowe drzewo katalogów:
Kod
Pliki w katalogu testowym:
Próbny
Jeśli brakuje klucza, mypy narzeka w wierszu poleceń:
Ustawienie
total=False
pozwala na opcjonalne klucze:Zobacz też
TypedDict
Python 3.8 autorstwa Real Pythontyping-extensions
pakiet do użyciaTypedDict
w Python 3.5, 3.6źródło