2013-04-06 9 views
48

पाइथन 3 में मैं तर्क और वापसी प्रकार एनोटेशन कर सकता हूं। उदाहरण:वर्तमान श्रेणी को रिटर्न टाइप एनोटेशन

class Graph: 
    def __init__(self, V: int, E: int, edges: list): 
     pass 

    @classmethod 
    def fromfile(cls, readobj: type(sys.stdin)): 
     pass 

    def V(self) -> int: 
     pass 

    def E(self) -> int: 
     pass 

समस्या मैं वर्तमान वर्ग (ग्राफ) है, जो अभी तक परिभाषित नहीं है की वापसी प्रकार भी एक टिप्पणी नहीं कर सकता है। उदाहरण:

class Graph: 
    def reverse(self) -> Graph: 
     pass 

इस कोड को त्रुटि के साथ चला जाता है

def reverse(self) -> Graph: 
NameError: name 'Graph' is not defined 

ये टिप्पणियां वास्तव में दोनों दस्तावेजीकरण और आईडीई तर्क समझते हैं और लौट प्रकार => स्वत: पूर्ण सक्षम

युपीडी करने की इजाजत दी लिए उपयोगी होते हैं: तो मैं जो आया वह यह असंभव है या मुझे कुछ पसंद हैक की आवश्यकता है, इसलिए मैंने केवल def reverse (self) -> 'Graph': का उपयोग करने का निर्णय लिया जो दस्तावेज़ के लिए समझ में आता है हालांकि नियम तोड़ता है। नकारात्मकता यह है कि यह आईडीई स्वत: पूर्ण करने के लिए काम नहीं करता है।

+0

क्या आपने कोशिश की है: 'def रिवर्स (स्वयं) -> प्रकार (स्वयं) ' – Ankur

+0

संभावित डुप्लिकेट [क्यों श्रेणी का नाम वापसी मूल्य फ़ंक्शन एनोटेशन के रूप में पहचाना नहीं जाता है?] (Http: // stackoverflow। कॉम/प्रश्न/15741887/क्यों-ऑफ-द-ऑफ-द-इन-द-ए-ऑफ-द-ए-ऑफ-द-इन-ए-ए-ए-रिटर्न-वैल्यू-फ़ंक्शनटियो) – eryksun

+2

संभावित डुप्लिकेट [मैं कैसे निर्दिष्ट करूं कि रिटर्न प्रकार एक विधि कक्षा के रूप में खुद ही पाइथन में समान है?] (https://stackoverflow.com/questions/33533148/how-do-i-specify-that-the-return-type-of-a-method-is- समान-के-द-क्लास-इज़ेल) –

उत्तर

29

तो अब थोड़ी देर बाद मैं कह सकता हूं कि मैंने जो निर्णय लिया वह के बजाय -> 'Graph' का उपयोग कर रहा था। यह मेरा आईडीई (पायचर्म) इस तरह से एक प्रकार को पहचानने में सक्षम नहीं है लेकिन यह दस्तावेज़ीकरण उद्देश्यों के लिए पर्याप्त रूप से पर्याप्त काम करता है।

एक अन्य संभावित समाधान मैं इस्तेमाल कर सकते हैं क्रम में एनोटेशन बदल रहा था, लेकिन वह प्रलेखन के साथ समस्या का समाधान नहीं करता है - आप कहीं स्रोतों के बीच में प्रकार घोषणाओं देखने के लिए चाहते नहीं होगा ...

कक्षा वास्तव में परिभाषित होने से पहले कक्षा वस्तु को पहचानने में समस्या जड़ें हैं। पाइथन में करना असंभव है।

+19

वास्तव में, यह एक संदर्भ का सही समाधान है जिसे आगे संदर्भ के रूप में जाना जाता है - https://www.python.org/dev/peps/pep-0484/#forward-references । और PyCharm का वर्तमान संस्करण (इस टिप्पणी को लिखने के समय में) यह लिखा गया एक टाइपी पहचानता है और सभी आवश्यक समर्थन प्रदान करता है। –

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