Python 3'teki __total__ dunder özelliğinin anlamı nedir?


17

Yeni yayınlanan Python 3.8'de yeni bir tür ek açıklaması var typing.TypedDict. Belgeleri,

İçgözlem için tür bilgisine Point2D.__annotations__ve üzerinden erişilebilir Point2D.__total__. [....]

PEP 3107'de__annotations__ tanıtıldığı iyi bilinmesine rağmen , hakkında hiçbir bilgi bulamıyorum . Herkes anlamını ve mümkünse yetkili kaynaklarla bağlantı kurabilir mi?__total__


4
Tipik. typingİç kısımların% 99'u belgelenmemiştir ve belgelenen kısım belgelenmemiştir.
Aran-Fey

Yanıtlar:


3

__total__Alan örneklerin tam (varsayılan) veya olmamalı (tüm alanlar isteğe bağlı) gerektiğini belirtiyor tahmin ediyorum . Aramaya bütünlüğü tanıtan ve anlatan PEP 589'da başladım TypedDict. Kullanılan birtotalclass Sözdizimi için dunder stilini yeniden adlandırmanın mantıklı olacağı argüman . Ancak, böyle bir yeniden adlandırma gerçekleştiğinde bulamadım.

Bu ek açıklamaları önemseyen gerçek tür denetleyicisi olan MyPy'ye bakıldığında, benzerlik TypedDictve bütünlük hakkında benzer belgeler var , ancak yine de dunder sözdizimine referans yok. Uygulamasının TypedDictTypekazılması , types.py dosyalarında olduğu gibi toplam bir alana sahip değil, ayrı itemsve daha fazla karışıklığa neden oldu required_keys. Bütünlük bunu ima eder, items.keys()==required_keysancak uygulama, aşağıdakilere can_be_falsegüvenmek gibi farklı varsayımlar yapar :items tek başına . total=Falseprensip required_keysolarak boş olmalıdır.

_TypedDictMeta için CPython kaynağı en azından totalargüman ve __total__dunder'ın bir ve aynı olduğunu ortaya koysa da, kaynak TypedDictkendisini "yakında eklenebilecek" olarak tanımlamaktadır .


Şimdilik bunu kabul etmek - başka bir şey değilse, belki de başkalarını öne çıkmaya ve cevabınızı reddetmeye daha istekli hale getirecektir: D
Antti Haapala

Ben şahsen bir can_be_falseşey MyPy hata, muhtemelen başlangıçtan itibaren isteğe bağlı alanları olması planlanmamış olması ile ilgili olduğundan şüpheleniyorum .
Yann Vernier

1

TypedDictPEP 589 aracılığıyla Python 3.8'de kabul edildi . Python'dan, __total__bir boole bayrağıTrue varsayılan olarak :

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

# <class 'bool'>
# True

Diğer gönderilerde belirtildiği gibi, bu yöntemle ilgili ayrıntılar dokümanlar ile sınırlıdır , ancak @Yann Vernier'in CPython kaynak koduna güçlü bir şekilde bağladığı , Python 3.8'de sunulan__total__ yeni totalanahtar kelimeyle ilgilidir :

# 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
        ...

O nasıl çalışır?

Özet : varsayılan olarak, tanımlı bir örneği başlatırken tüm anahtarlar gereklidir TypedDict. total=Falsebu kısıtlamayı geçersiz kılar ve isteğe bağlı anahtarlara izin verir. Aşağıdaki gösteriye bakın.

verilmiş

Bir test dizini ağacı:

resim açıklamasını buraya girin

kod

Test dizinindeki dosyalar:

# 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"

gösteri

Bir anahtar eksikse, mypy komut satırında şikayet edecektir:

> mypy code/rgb_bad.py
code\rgb_bad.py:11: error: Key 'a' missing for TypedDict "Color"
...

Ayar total=Falseisteğe bağlı tuşlara izin verir:

> mypy code/rgb_good.py
Success: no issues found in 1 source file

Ayrıca bakınız

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.