मैं PyCharm को कैसे बता सकता हूं कि किस प्रकार का पैरामीटर होने की उम्मीद है?


173

जब यह कंस्ट्रक्टर, और असाइनमेंट, और मेथड कॉल्स की बात आती है, तो PyCharm IDE मेरे सोर्स कोड का विश्लेषण करने और यह पता लगाने में बहुत अच्छा है कि प्रत्येक वेरिएबल किस प्रकार का होना चाहिए। मुझे यह पसंद है जब यह सही है, क्योंकि यह मुझे अच्छा कोड पूरा करने और पैरामीटर जानकारी देता है, और यह मुझे चेतावनी देता है अगर मैं एक विशेषता तक पहुंचने का प्रयास करता हूं जो मौजूद नहीं है।

लेकिन जब मापदंडों की बात आती है, तो यह कुछ भी नहीं जानता है। कोड पूरा करने वाले ड्रॉपडाउन कुछ भी नहीं दिखा सकते हैं, क्योंकि वे नहीं जानते हैं कि पैरामीटर किस प्रकार का होगा। कोड विश्लेषण चेतावनी के लिए नहीं देख सकते हैं।

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

peasant = Person("Dennis", 37)
# PyCharm knows that the "peasant" variable is of type Person
peasant.dig_filth()   # shows warning -- Person doesn't have a dig_filth method

class King:
    def repress(self, peasant):
        # PyCharm has no idea what type the "peasant" parameter should be
        peasant.knock_over()   # no warning even though knock_over doesn't exist

King().repress(peasant)
# Even if I call the method once with a Person instance, PyCharm doesn't
# consider that to mean that the "peasant" parameter should always be a Person

यह एक निश्चित मात्रा में समझ में आता है। अन्य कॉल साइटें उस पैरामीटर के लिए कुछ भी पारित कर सकती हैं। लेकिन अगर मेरा तरीका किसी पैरामीटर के प्रकार के होने की अपेक्षा करता है, तो कहो, pygame.Surfaceमैं यह संकेत देना चाहूंगा कि किसी भी तरह PyCharm को सूचित कर सकूं, इसलिए यह मुझे Surfaceउसके कोड-पूरा ड्रॉपडाउन में सभी विशेषताओं को दिखा सकता है , और चेतावनियों को उजागर कर सकता है मैं गलत तरीके से कॉल करता हूं, और इसी तरह।

क्या कोई ऐसा तरीका है जिससे मैं PyCharm को एक संकेत दे सकता हूं, और कह सकता हूं कि "psst, यह पैरामीटर टाइप X का होना चाहिए"? (या शायद, गतिशील भाषाओं की भावना में, "यह पैरामीटर एक एक्स की तरह खत्म करने के लिए माना जाता है"; मैं उस के साथ ठीक होगा।)


EDIT: क्रेजीकोडर का जवाब, नीचे दिया गया है। मेरे जैसे किसी भी नवागंतुक के लिए जो त्वरित सारांश चाहते हैं, यहां यह है:

class King:
    def repress(self, peasant):
        """
        Exploit the workers by hanging on to outdated imperialist dogma which
        perpetuates the economic and social differences in our society.

        @type peasant: Person
        @param peasant: Person to repress.
        """
        peasant.knock_over()   # Shows a warning. And there was much rejoicing.

संबंधित भाग @type peasant: Personडॉकस्ट्रिंग की रेखा है।

यदि आप फ़ाइल> सेटिंग्स> पायथन इंटीग्रेटेड टूल्स में भी जाते हैं और "डॉकस्ट्रिंग फॉर्मेट" को "एप्टीटेक्स्ट" पर सेट करते हैं, तो पाइक्रोम का व्यू> क्विक डॉक्यूमेंटेशन लुकअप पैरामीटर-इनफॉर्मेशन को प्रिंट करने के बजाय सिर्फ सभी @ -लाइन को प्रिंट करने के बजाय प्रिंट करेगा।


7
यह ध्यान दिया जाना चाहिए कि reStructuredText टिप्पणी केवल उन्हीं टैग्स का उपयोग करती है जो अलग तरह से लिखे गए हैं: @param xx: yyyबन जाता है :param xx: yyyजेटब्राइन्स
pycharm/

1
हम पूरी तरह से योग्य वर्ग नाम निर्दिष्ट नहीं करने के साथ क्यों दूर हो सकते हैं?
जेसविन जोस

जवाबों:


85

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

उदाहरण के लिए, PyCharm @param शैली टिप्पणियों से प्रकार निकालता है ।

रीस्ट्रक्टर्डटेक्स्ट और डॉकस्ट्रिंग कन्वेंशन (पीईपी 257) भी देखें ।

एक अन्य विकल्प पायथन 3 एनोटेशन है।

कृपया अधिक विवरण और नमूनों के लिए PyCharm प्रलेखन अनुभाग देखें।


2
मुझे लगता है कि PyCharm ने doc प्रारूप को थोड़ा बदल दिया है (देखें jetbrains.com/help/pycharm/… ), लेकिन धन्यवाद! मापदंडों पर अंतरंगता की कमी मुझे पागल कर रही थी।
स्टब्स

46

यदि आप पायथन 3.0 या उसके बाद का उपयोग कर रहे हैं, तो आप फ़ंक्शन और मापदंडों पर एनोटेशन का भी उपयोग कर सकते हैं। PyCharm इनकी व्याख्या उस प्रकार से करेंगे जिस प्रकार की दलीलें या रिटर्न वैल्यूज़ होने की उम्मीद है:

class King:
    def repress(self, peasant: Person) -> bool:
        peasant.knock_over() # Shows a warning. And there was much rejoicing.

        return peasant.badly_hurt() # Lets say, its not known from here that this method will always return a bool

कभी-कभी यह गैर-सार्वजनिक तरीकों के लिए उपयोगी होता है, जिसे डॉकस्ट्रिंग की आवश्यकता नहीं होती है। अतिरिक्त लाभ के रूप में, उन एनोटेशन को कोड द्वारा एक्सेस किया जा सकता है:

>>> King.repress.__annotations__
{'peasant': <class '__main__.Person'>, 'return': <class 'bool'>}

अद्यतन : PEP 484 के रूप में , जिसे पायथन 3.5 के लिए स्वीकार किया गया है, यह भी एनोटेशन का उपयोग करके तर्क और वापसी प्रकार निर्दिष्ट करने के लिए आधिकारिक सम्मेलन है।


4
... और कई पैकेज हैं जो रन-टाइम टाइप-चेकिंग करने के लिए इस तरह के अनाउंसमेंट का उपयोग करते हैं। यह उपयोग करने के लिए उपयोग करने के लिए सुविधाजनक और पढ़ने में आसान है, क्योंकि दावे के अनुसार ही इसे पढ़ा जा सकता है और इसे चुनिंदा रूप से उपयोग किया जा सकता है। typecheck-decoratorऐसा एक पैकेज है और इसके प्रलेखन में दूसरों का सारांश है। (लचीले, भी: आप टाइप-चेक किए गए बतख टाइपिंग भी कर सकते हैं!)
लूत्ज़ प्रीचेल

5

PyCharm @type pydoc स्ट्रिंग से प्रकार निकालता है। यहाँ और यहाँ PyCharm डॉक्स देखें , और Epydoc डॉक्स । यह Pyharm के 'विरासत' खंड में है, शायद इसमें कुछ कार्यक्षमता का अभाव है।

class King:
    def repress(self, peasant):
        """
        Exploit the workers by hanging on to outdated imperialist dogma which
        perpetuates the economic and social differences in our society.

        @type peasant: Person
        @param peasant: Person to repress.
        """
        peasant.knock_over()   # Shows a warning. And there was much rejoicing.

संबंधित भाग @type peasant: Personडॉकस्ट्रिंग की रेखा है।

मेरा इरादा क्रेजीकोडर या मूल प्रश्नकर्ता से अंक चोरी करना नहीं है, हर तरह से उन्हें उनके अंक देना है। मैंने सोचा कि सरल उत्तर एक 'उत्तर' स्लॉट में होना चाहिए।


2

मैं PyCharm Professional 2016.1 लेखन py2.6-2.7 कोड का उपयोग कर रहा हूं, और मैंने पाया कि reStructuredText का उपयोग करके मैं अधिक रसीले तरीके से प्रकार व्यक्त कर सकता हूं:

class Replicant(object):
    pass


class Hunter(object):
    def retire(self, replicant):
        """ Retire the rogue or non-functional replicant.
        :param Replicant replicant: the replicant to retire.
        """
        replicant.knock_over()  # Shows a warning.

देखें: https://www.jetbrains.com/help/pycharm/2016.1/type-hinting-in-pycharm.html##acy


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.