2011-06-11 18 views
158

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

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

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, यह पैरामीटर टाइप एक्स का होना चाहिए"? (या शायद, गतिशील भाषाओं की भावना में, "इस पैरामीटर माना जाता है एक एक्स की तरह नीम हकीम के लिए" मैं उस के साथ ठीक हो जाएगा?।)


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

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. 

प्रासंगिक हिस्सा docstring की @type peasant: Person रेखा है।

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

+7

उल्लेखनीय यह है कि reStructuredText टिप्पणी ही टैग सिर्फ अलग ढंग से लिखा का उपयोग करें: '@param xx: yyy' हो जाता है': param xx: yyy'। देखें http://www.jetbrains.com/pycharm/webhelp/creating-documentation-comments.html – Wernight

+1

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

उत्तर

76

हां, आप विधियों और उनके पैरामीटर के लिए विशेष दस्तावेज़ीकरण प्रारूप का उपयोग कर सकते हैं ताकि PyCharm इस प्रकार को जान सके। हालिया PyCharm संस्करण supports most common doc formats

उदाहरण के लिए, PyCharm @param style comments से प्रकार निकालता है।

reStructuredText और docstring conventions (पीईपी 257) भी देखें।

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

अधिक जानकारी और नमूने के लिए कृपया refer to the PyCharm documentation section कृपया।

+1

मुझे लगता है कि PyCharm ने इसके दस्तावेज़ प्रारूप को थोड़ा सा बदल दिया है (https://www.jetbrains.com/help/pycharm/using-docstrings-to-specify-types.html देखें), लेकिन धन्यवाद! पैरामीटर पर इंटेलिजेंस की कमी मुझे पागल कर रही थी। – stubs

43

यदि आप पाइथन 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 

कभी कभी यह गैर सरकारी तरीकों, कि एक docstring की जरूरत नहीं है के लिए उपयोगी है।

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

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

+4

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

3

PyCharm एक @type pydoc स्ट्रिंग से प्रकार निकालता है। PyCharm दस्तावेज़ here और here, और Epydoc docs देखें। यह PyCharm के 'विरासत' खंड में है, शायद इसमें कुछ कार्यक्षमता की कमी है।

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. 

प्रासंगिक हिस्सा docstring की @type peasant: Person रेखा है।

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

0

मैं PyCharm व्यावसायिक 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#legacy

1

आप यह भी एक प्रकार के लिए जोर कर सकते हैं और Pycharm यह अनुमान कर देगा:

def my_function(an_int): 
    assert isinstance(an_int, int) 
    # Pycharm now knows that an_int is of type int 
    pass 
संबंधित मुद्दे

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