पायथन 3 में __total__ डंडर विशेषता का अर्थ क्या है?


17

नए जारी पायथन 3.8 में एक नए प्रकार का एनोटेशन है typing.TypedDict। इसके प्रलेखन में उल्लेख है कि

आत्मनिरीक्षण के लिए प्रकार की जानकारी के माध्यम से Point2D.__annotations__और पहुँचा जा सकता है Point2D.__total__। [....]

जबकि __annotations__अच्छी तरह से जाना जाता है, होने में शुरू किया गया पीईपी 3107 , मैं पर कोई जानकारी नहीं मिल सकता है __total__। क्या कोई इसका अर्थ समझा सकता है और यदि संभव हो तो इसे आधिकारिक स्रोतों से जोड़ना है?


4
ठेठ। ९९% typingइंटर्नल का दस्तावेजीकरण नहीं किया गया है, और जो हिस्सा है वह खराब तरीके से प्रलेखित है।
अरन-फे

जवाबों:


3

मैं यह अनुमान लगा रहा हूं कि __total__क्षेत्र यह दर्शाता है कि क्या उदाहरण पूर्ण (डिफ़ॉल्ट) होने चाहिए या नहीं (सभी फ़ील्ड वैकल्पिक)। मैंने PEP 589 पर अपनी खोज शुरू की , जो TypedDictइस तरह की समग्रता का परिचय और वर्णन करता है। इसने एक totalतर्क का उपयोग किया , जिसका अर्थ class सिंटैक्स के लिए डंडर-शैली का नाम बदलना होगा । हालांकि, जब इस तरह का नाम बदला गया तो मुझे नहीं मिला।

MyPy को देखते हुए, जो वास्तविक प्रकार चेकर है जो इन एनोटेशन की परवाह करता है, पर TypedDictऔर समग्रता के समान दस्तावेज हैं , लेकिन फिर से डंडर सिंटैक्स का कोई संदर्भ नहीं है। इसके क्रियान्वयन में खुदाई करने से और अधिक भ्रम पैदा हुआ, क्योंकि TypedDictTypeटाइप एरोमा में कुल क्षेत्र नहीं है, लेकिन अलग itemsऔर required_keys। समग्रता का अर्थ यह होगा कि items.keys()==required_keysलेकिन कार्यान्वयन अलग-अलग धारणाएँ बनाता है, जैसे कि अकेले can_be_falseभरोसा करना itemstotal=Falseसिद्धांत रूप required_keysमें खाली होना चाहिए ।

_TypedDictMeta के लिए CPython स्रोत कम से कम यह बताता है कि totalतर्क और डंडर__total__ एक हैं और एक ही हैं, हालांकि स्रोत TypedDictखुद को "जल्द ही जोड़ा जा सकता है" जैसा बताता है।


इसे अभी के लिए स्वीकार करना - अगर कुछ और नहीं, तो शायद यह दूसरों को आगे आने के लिए तैयार कर देगा और आपके जवाब का खंडन करेगा: डी
एंटी हापला

मुझे व्यक्तिगत रूप से इस can_be_falseबात पर संदेह है कि यह एक MyPy बग है, संभवतः शुरू से वैकल्पिक क्षेत्र रखने की योजना नहीं बनाने से संबंधित है।
यान वर्नियर

1

TypedDictPEP 589 के माध्यम से पायथन 3.8 में स्वीकार किया गया था । पायथन से, ऐसा प्रतीत होता है __total__कि एक बूलियन ध्वज Trueडिफ़ॉल्ट रूप से सेट है :

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

# <class 'bool'>
# True

जैसा कि अन्य पोस्ट में बताया गया है, इस पद्धति पर विवरण डॉक्स में सीमित हैं , लेकिन @Yann Vernier का CPython स्रोत कोड से लिंक होना दृढ़ता से बताता __total__है कि पायथन 3.8 में पेश किए गए नए 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
        ...

यह कैसे काम करता है?

सारांश : डिफ़ॉल्ट रूप से, परिभाषित करते समय सभी कुंजी की आवश्यकता होती है TypedDicttotal=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

यह सभी देखें

  • समग्र रूप से प्रदर्शन करने वाले आर। हेटिंगर द्वारा ट्वीट
  • पीईपी 589 में समग्रता पर पीईपी अनुभाग
  • रियल पायथन द्वारा प्रकार और पायथन 3.8 में अनुच्छेद अनुभागTypedDict
  • typing-extensionsTypedDictपायथन 3.5, 3.6 में उपयोग करने के लिए पैकेज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.