5

अनिश्चित के लिए कन्वेंशन संकेत - मैं उन्हें __init__ निर्माता तर्क के भीतर कर रहा हूँ की तरह यहां देखी गई:प्रकार उदाहरण चर अजगर प्रकार इशारा उदाहरण चर के लिए अजगर सम्मेलन की

class LoggedVar(Generic[T]): 
    def __init__(self, value: T, name: str, logger: Logger) -> None: 
     self.name = name 
     self.logger = logger 
     self.value = value` 

उपरोक्त लिंक पर क्लिक करने के लिए कोड का टुकड़ा: https://docs.python.org/3/library/typing.html#user-defined-generic-types

लेकिन मैं यह भी पीईपी __init__ तर्क के भीतर इस तरह के (नीचे टुकड़ा) के रूप में व्याख्या उदाहरण चर के सम्मेलनों और उसके बाद भी कर रही है प्रकार हिंट देखें:

class BasicStarship: 
    captain: str = 'Picard'    # instance variable with default 
    damage: int       # instance variable without default 
    stats: ClassVar[Dict[str, int]] = {} # class variable` 

    def __init__(self, damage: int, captain: str = None): 
     self.damage = damage 
     if captain: 
      self.captain = captain # Else keep the default 

अन्त में, बाद में PEP526 लेख में पर वे कहते हैं कि एक सुविधा और सम्मेलन के लिए निम्न कर सकते हैं:

class Box(Generic[T]): 
    def __init__(self, content): 
     self.content: T = content 

यूआरएल दो के लिए ऊपर कोड के टुकड़े: https://www.python.org/dev/peps/pep-0526/#class-and-instance-variable-annotations

तो इन सम्मेलनों में से एक है दूसरों की तुलना में बेहतर/अधिक व्यापक रूप से स्वीकार्य है कि मुझे चिपकने की कोशिश करनी चाहिए (बेहतर पठनीयता आदि ..)?

+0

मुझे अब तक पीईपी 526 से अनजान था; धन्यवाद। – chepner

+0

दूसरे उदाहरण में 'कप्तान' और 'क्षति' उदाहरण चर क्यों हैं? क्या वे कक्षा चर भी नहीं हैं? या यह तथ्य है कि वे इनिट विधि में उन्हें आवृत्ति चर बनाने के लिए बदल रहे हैं? अगर मेरे पास एक सूची होगी, और इसे 'list.append()' के साथ बदल देगा कि परिवर्तन सभी मामलों में साझा किया जाएगा, तो यह अभी भी एक वर्ग चर होगा। – Asara

उत्तर

1

मैं पहले संस्करण का उपयोग करने की अनुशंसा करता हूं, जहां आप अधिकांश परिस्थितियों के लिए अपने __init__ विधि के मानकों को टाइप करते हैं।

उस विशेष विधि में कम से कम अनावश्यकता होती है जबकि टाइप चेकर्स को यह सत्यापित करने की अनुमति मिलती है कि आप __init__ विधि को अपने कोड में कहीं और सही तरीके से कॉल कर रहे हैं।

मैं जब अपने __init__ विधि बात करने के लिए पर्याप्त जटिल हो गया है या तो दूसरे या तीसरे संस्करण है, जहां आप स्पष्ट रूप से अपने खेतों व्याख्या (अंदर या बाहर __init__) का उपयोग कर की सिफारिश करेंगे जहां से एक या अधिक निम्न लागू होते हैं:

  1. यह अब वास्तव में क्या अपने क्षेत्रों के साथ
  2. अब अपने मानकों को और अपने क्षेत्रों के बीच एक-से-एक मानचित्रण है शुरू कर रहे हैं तो सीधा है
  3. आप जटिल आरंभीकरण तर्क को धुंधला कि कैसे अपने खेतों किया जा रहा है है सौंपा।

हालांकि, यह मेरे लिए स्पष्ट नहीं था कि दूसरे या तीसरे संस्करण पसंद किया जाता था - मैं व्यक्तिगत रूप से तीसरे संस्करण पसंद करते हैं इसे और अधिक धारणात्मक क्लीनर है और बनाम वर्ग जिम्मेदार बताते उदाहरण की धारणा मिश्रण प्रतीत नहीं होता है क्योंकि, लेकिन मैं दूसरे संस्करण को क्लीनर दिखने से इंकार नहीं कर सकता।

मैंने इसके बारे में 'टाइपिंग' गिटर चैनल पर पूछा, और ग्विडो से निम्नलिखित प्रतिक्रिया मिली (जिसने आपको पता नहीं चला कि पाइथन बनाया गया है और वर्तमान में मैपी और टाइपिंग संबंधित सामग्री पर काम कर रहा है) :

किसी भी तरह से मजबूत राय प्रतीत होता है। मैं वास्तव में __init__ और अन्य विधियों में उन्हें छिड़कने के बजाय कक्षा निकाय में विशेषता एनोटेशन डालना पसंद करता हूं। मुझे यह भी लगता है कि पीईपी 526 के साथ यह भविष्य होगा (कक्षा-आधारित नामांकित टुपल घोषणाओं और संभवतः https://github.com/ericvsmith/dataclasses जैसी चीजों के साथ)।

(link to quote)

तो, ऐसा लगता है जैसे दूसरे संस्करण तिहाई से अधिक की सिफारिश की है, और कहा कि ढंग से परिभाषित करने कि कक्षाओं भविष्य में कुछ बिंदु पर अजगर भाषा में ही और अधिक गहराई से एकीकृत हो जाएगा !

संपादित करें:PEP 557, data classesrecently accepted था और ऑन ट्रैक अजगर 3.7 के साथ शामिल किया जाना प्रतीत होता है (?)।

1

मैं लॉगगेडवर में जो कर रहा हूं उसके साथ रहना चाहता हूं, यह पाइथन में हर जगह के समान नियमों का पालन करता है, जो पूरे दौर में इतनी कम भ्रम है।

बेसिकस्टारशिप कक्षा उन्हें __init__ फ़ंक्शन से बाहर ले जाकर चर के दायरे को बदल देती है। कप्तान के साथ घोषित किया गया कि BasicStarShip.captain 'पिकार्ड' वापस आ जाएगा।

पीईपी 526 एनोटेशन पढ़ने के लिए अच्छा है, लेकिन यह एक विशिष्ट मामले, __init__ फ़ंक्शन के लिए एक नया नियम है। पायथन के जेन: "नियमों को तोड़ने के लिए विशेष मामले पर्याप्त नहीं हैं।"

संबंधित मुद्दे