2010-10-26 5 views
11

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

एक मुद्दे को छोड़कर अधिक पठनीय: टाइपो।

निम्नलिखित सरल उदाहरण पर विचार करें (ध्यान दें, मेरे गुण वास्तव में कुछ प्रसंस्करण भले ही उदाहरण यहाँ सिर्फ सेट एक सरल चर करते हैं या वापसी) उत्पादन, जो कोई एक छोटे से बारीकी से पढ़ता है देखेंगे के रूप में

class GotNoClass(object): 

    def __init__(self): 
     object.__init__(self) 
     self.__a = None 

    def __set_a(self, a): 
     self.__a = a 

    def __get_a(self): 
     return self.__a 

    paramName = property(__get_a, __set_a) 


if __name__ == "__main__": 
    classy = GotNoClass() 

    classy.paramName = 100 
    print classy.paramName 

    classy.paranName = 200 
    print classy.paramName 

    #oops! Typo above! as seen by this line: 
    print classy.paranName 

, है:

100 
100 
200 

ओह। इस तथ्य को छोड़कर नहीं होना चाहिए था कि मैंने एक टाइपो बनाया - मैंने परमनाम के बजाय परानानाम (दो एन) लिखा था।

इस सरल उदाहरण में डीबग करना आसान है, लेकिन यह मुझे मेरी बड़ी परियोजना में चोट पहुंचा रहा है। चूंकि पाइथन खुशी से एक नया चर बनाता है जब मैं गलती से संपत्ति का उपयोग करना चाहता था, मुझे अपने कोड में सूक्ष्म त्रुटियां मिलती हैं। त्रुटियां जो मुझे कई बार ट्रैक करने में मुश्किल लग रही हैं। इससे भी बदतर, मैंने एक बार एक ही टाइपो को दो बार इस्तेमाल किया (एक बार जब मैं सेटिंग कर रहा था और बाद में एक बार जब मैं प्राप्त कर रहा था) तो मेरा कोड काम करने लग रहा था लेकिन बहुत बाद में, जब कोड की एक अलग शाखा ने अंततः इस संपत्ति तक पहुंचने की कोशिश की (सही ढंग से) मुझे गलत मूल्य मिला - लेकिन मुझे एहसास हुआ कि मेरे नतीजे थोड़े दूर थे, मुझे कई दिन लग गए।

अब मुझे पता है कि यह एक मुद्दा है, मैं अपने कोड को बारीकी से पढ़ने में अधिक समय बिता रहा हूं, लेकिन आदर्श रूप से मुझे इस स्थिति को स्वचालित रूप से पकड़ने का एक तरीका होगा - अगर मुझे केवल एक याद आती है तो मैं एक त्रुटि पेश नहीं कर सकता एक उचित समय बीतने तक दिखाएं ...

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

धन्यवाद।

पीएस मैं समझता हूं कि यह पाइथन के लाभों में से एक है और मैं इसके बारे में शिकायत नहीं कर रहा हूं। बस सोच रहा हूं कि मैं स्पष्ट सेटर्स और गेटर्स का उपयोग कर बेहतर होगा या नहीं।

+0

एक ही चीज सरल विशेषताओं के लिए होती है, स्थानीय चर का उल्लेख नहीं करना। यह भाषा के डिजाइन का प्रत्यक्ष दुष्प्रभाव है और इसे "ठीक करने" की कोशिश करने से आम तौर पर बड़ी समस्याएं पैदा होती हैं। हालांकि, मैंने इसे कभी भी एक मुद्दा नहीं पाया है। –

+0

यह बिल्कुल सही है और मैंने पोस्ट करने के बाद मैंने इसके बारे में थोड़ा और सोचा। मुझे लगता है कि यह और अधिक होने का कारण यह है कि मैं अब गुणों पर भरोसा कर रहा हूं (बनाम मेरे पुराने सेटर्स और गेटर्स) और इसलिए इस तरह की त्रुटि में भाग लेने की अधिक संभावना है। यह चाल संभवतः जितनी ज्यादा हो सके मुद्दे को कम करने और अधिक सावधान रहना होगा। – Ben

उत्तर

0

ऐसे समय होते हैं जब संकलन-समय की जांच वास्तव में समय बचाती है। ऐसा लगता है कि आपने ऐसा एक मामला पहचाना है। सावधान विकल्प के बजाय दुर्घटना से मैं गेटर्स और सेटर्स का उपयोग करता हूं, और खुश हूं ;-)

2

आपका कोड कैसे काम करता है, इस पर निर्भर करता है कि आप slots का उपयोग करने का प्रयास कर सकते हैं। स्लॉट्स में कुछ ऐसा असाइन करने का प्रयास करते समय आपको एक एट्रिब्यूट एरर अपवाद फेंक दिया जाएगा, जो इस तरह के टाइपो को और अधिक स्पष्ट बना देगा।

+0

वाह।स्लॉट बहुत ही रोचक हैं (और मेरे लिए नया)। मैं निश्चित रूप से उन्हें अपने ऐप के हिस्से के रूप में लागू कर रहा हूं, लेकिन इस मुद्दे को हल नहीं करना चाहता हूं। इसके लिए ऐसा प्रतीत होता है कि यह उनके इच्छित उद्देश्य का दुरुपयोग हो सकता है (जो, मैं इकट्ठा करता हूं, उन वस्तुओं के स्मृति पैरों के निशान को कम करना है जिन्हें कई बार इंस्टॉल किया जा सकता है)। एक बात जिसे मैं विचार कर रहा हूं, हालांकि, अस्थायी रूप से विकास के दौरान उनका उपयोग करना है और फिर मेरा कोड पूरा करने के बाद उन्हें बंद कर देना है - इस तरह वे अब मुझे ईमानदार बनाएंगे लेकिन वास्तव में मेरे ऐप के बाद उपयोग में नहीं होंगे (या दुर्व्यवहार?) पूर्ण। – Ben

+0

दूसरे विचार पर, __slots__ का उपयोग करने के कुछ अनपेक्षित परिणामों को देखते हुए, मैं विकास के दौरान भी उन्हें लागू नहीं करूँगा। यद्यपि सीखने के लिए अभी भी बहुत अच्छा है। – Ben

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