दिलचस्प पोस्ट
जावा जेनेरिक्स – पुल विधि? अक्षर सेटों के बीच पाठ फ़ाइलों को बदलने का सर्वोत्तम तरीका? डाटाबेस। बेनिफ्रेंस ट्रांजैक्शन बनाम लेनदेन। ट्रांन्सैक्शनस्स्कोप एचटीएमएल चपलता पैक – पार्सिंग टेबल IQueryable के EntityFramework के कार्यान्वयन की सीमाओं का नकली कैसे करें MySQL – समूह में नहीं एक कॉलम का चयन करके जावा में एएससीआईआई से ईबीसीडीआईसी से स्ट्रिंग को परिवर्तित करें? पासवर्ड ताकत की जांच लाइब्रेरी बूटस्ट्रैप 3 – कैसे AJAX के माध्यम से मोडल बॉडी में सामग्री को लोड करें? एक नंबर पर 'दशमलव चिह्न' हजारों विभाजक जोड़ें कैप्चा का उपयोग किए बिना टिप्पणी स्पैम अवरुद्ध जावा एफएक्स और ओपनजेडीके एक आईओएस आवेदन में कुकीज़ जारी रखने? PHP मेल के साथ त्रुटि (): अतिरिक्त_हेडर में पाए गए एकाधिक या खराब न्यूलाइन तिथि के आधार पर वापसी क्वेरी

पायथन के लिए सर्वश्रेष्ठ अभ्यास

  1. मानक कोड के भाग के रूप में उपयोग करने के बजाय केवल डिबगिंग प्रयोजनों के लिए उपयोग करने के साथ कोई प्रदर्शन या कोड रखरखाव समस्या है?

    है

     assert x >= 0, 'x is less than zero' 

    बेहतर या उससे भी बदतर

     if x < 0: raise Exception, 'x is less than zero' 
  2. इसके अलावा, कोई व्यावसायिक नियम सेट करने का कोई तरीका है जैसे if x < 0 raise error करता है जो हमेशा बिना try/except/finally है, अगर किसी भी समय कोड में 0 से कम त्रुटि एक त्रुटि से बढ़ी है, जैसे कि आप किसी फ़ंक्शन की शुरुआत में assert x < 0 सेट करें, जहां कहीं भी कम हो जाता है, 0 एक अपवाद उठाया जाता है?

Solutions Collecting From Web of "पायथन के लिए सर्वश्रेष्ठ अभ्यास"

फ़ंक्शन भर में शून्य से शून्य हो जाने पर त्रुटि को स्वचालित रूप से फेंकने में सक्षम होने के लिए आप वर्ग विवरणक का उपयोग कर सकते हैं यहाँ एक उदाहरण है:

 class LessThanZeroException(Exception): pass class variable(object): def __init__(self, value=0): self.__x = value def __set__(self, obj, value): if value < 0: raise LessThanZeroException('x is less than zero') self.__x = value def __get__(self, obj, objType): return self.__x class MyClass(object): x = variable() >>> m = MyClass() >>> mx = 10 >>> mx -= 20 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "my.py", line 7, in __set__ raise LessThanZeroException('x is less than zero') LessThanZeroException: x is less than zero 

उन स्थितियों का परीक्षण करने के लिए आवेदकों का इस्तेमाल किया जाना चाहिए जो कभी नहीं हो । उद्देश्य भ्रष्ट कार्यक्रम राज्य के मामले में जल्दी ही दुर्घटनाग्रस्त होना है।

गलतियों के लिए अपवाद का उपयोग किया जा सकता है जो संभवतया हो सकता है, और आप लगभग हमेशा अपना अपवाद वर्ग बनाना चाहिए।


उदाहरण के लिए, यदि आप किसी कॉन्फ़िगरेशन फ़ाइल से एक dict में पढ़ने के लिए एक फ़ंक्शन लिख रहे हैं, तो फ़ाइल में अनुचित स्वरूपण को एक ConfigurationSyntaxError बढ़ा देना चाहिए, जबकि आप यह assert कर सकते assert कि आप None लौटने के बारे में हैं


आपके उदाहरण में, यदि x एक यूज़र इंटरफेस या बाहरी स्रोत से एक वैल्यू सेट है, तो अपवाद सबसे अच्छा है

अगर x केवल एक ही कार्यक्रम में अपने कोड के द्वारा निर्धारित किया जाता है, तो एक तर्क के साथ जाएं।

संकलन अनुकूलित किया जाता है जब "जोर" बयान हटा रहे हैं । तो, हाँ, दोनों प्रदर्शन और कार्यात्मक अंतर हैं

अनुकूलन का संकलन समय पर अनुरोध किया जाता है जब वर्तमान कोड जनरेटर एक जोर देने के लिए कोई कोड का उत्सर्जन करता है। – पायथन 2.6.4 डॉक्स

यदि आप अनुप्रयोग कार्यक्षमता को लागू करने के लिए उपयोग करते हैं, तो उत्पादन पर तैनाती का अनुकूलन करते हैं, तो आपको "लेकिन-यह-कार्य-इन-देव" दोषों से ग्रस्त हो जाएगा

पीथोनोपटीमिसेज और -ओ – ओ देखें

मान लें कि आप चार सहयोगियों ऐलिस, बर्ग, कार्ल, और डाफ्ने के साथ 200,000 लाइन कोड पर काम करते हैं। वे अपने कोड को कॉल करते हैं, आप उनके कोड कहते हैं

फिर assert से चार भूमिकाएं हैं :

  1. आपके कोड की उम्मीद के अनुसार ऐलिस, बर्ट, कार्ल, और डाफ्ने को सूचित करें।
    मान लें कि आपके पास एक विधि है जो ट्यूपल्स की एक सूची को संसाधित करती है और प्रोग्राम लॉजिक तोड़ सकती है अगर ये ट्यूप्ले अपरिवर्तनीय नहीं हैं:

     def mymethod(listOfTuples): assert(all(type(tp)==tuple for tp in listOfTuples)) 

    यह दस्तावेज़ में समतुल्य जानकारी से अधिक भरोसेमंद है और बनाए रखने के लिए बहुत आसान है।

  2. कंप्यूटर को बताएं जो आपके कोड की अपेक्षा करता है
    assert आपके कोड के कॉल करने वालों से उचित व्यवहार को लागू करता है। अगर आपका कोड ऐलिसिस और बेरंड का कोड आपको कॉल करता है, तो assert बिना, अगर प्रोग्राम को एलाइसिस कोड में क्रैश हो जाता है, तो बेरेंड मान सकता है कि यह ऐलिस की गलती थी, एलिस ने जांच की और शायद यह आपकी गलती हो सकती है, आप जांच कर सकते हैं और बर्न को बता सकते हैं वास्तव में उसका बहुत सारे काम खो गए
    जोर देकर कहते हैं, जो कोई भी कॉल गलत कर लेता है, वे जल्दी ही यह देख पाएंगे कि यह उनकी गलती थी, तुम्हारी नहीं। ऐलिस, बेरंड, और आप सभी लाभ बहुत अधिक समय बचाता है

  3. अपने कोड के पाठकों को सूचित करें (स्वयं सहित) कुछ बिंदु पर आपके कोड ने क्या हासिल किया है
    मान लें कि आपके पास प्रविष्टियों की सूची है और उनमें से प्रत्येक को साफ किया जा सकता है (जो अच्छा है) या यह smoth, trale, gullup, या twinkled (जो सभी स्वीकार्य नहीं हैं) हो सकते हैं। अगर यह मुस्कुराहट है, तो इसे असंतुष्ट होना चाहिए; अगर यह trale है यह baludoed होना चाहिए; अगर यह गुलुप है, तो इसे गुमराह किया जाना चाहिए (और फिर संभवत: पुस्तक, भी); अगर यह twinkled है यह गुरुवार को छोड़कर फिर से झिझक होना चाहिए आपको यह विचार मिलता है: यह जटिल सामान है लेकिन अंतिम परिणाम (या होना चाहिए) सभी प्रविष्टियां साफ हैं सही चीज (टीएम) करना आपके सफाई लूप के प्रभाव को संक्षेप में प्रस्तुत करना है

     assert(all(entry.isClean() for entry in mylist)) 

    यह कथन समझने की कोशिश कर रहे सभी लोगों के लिए एक सिरदर्द बचाता है, जो वास्तव में यह है कि अद्भुत लूप प्राप्त हो रहा है। और इन लोगों की सबसे अक्सर संभावना खुद हो जाएगा

  4. आपके कोड को किसी बिंदु पर हासिल किया गया कंप्यूटर को सूचित करें।
    क्या आपको कभी भी एक प्रविष्टि को गति देने के बाद भूलना चाहिए, यह आपके दिन को बचाएगा और इससे बचने से आपका कोड टूट जाएगा क्योंकि प्रिय डेफने बहुत बाद में

मेरे दिमाग में, प्रलेखन के दो उद्देश्यों (1 और 3) का assert और रक्षा (2 और 4) समान मूल्यवान हैं।
लोगों को सूचित करना कंप्यूटर को सूचित करने से ज्यादा मूल्यवान भी हो सकता है क्योंकि यह बहुत गलतियों को रोकने के उद्देश्य को पकड़ सकता है (1 मामले में) और किसी भी मामले में बाद की गलतियों के बहुत सारे।

अन्य उत्तरों के अलावा, खुद को अपवाद फेंकने का दावा करता है, लेकिन केवल आश्वासनएरर्स उपयोगितावादी दृष्टिकोण से, जब आपको ठीक अनाज नियंत्रण की ज़रूरत होती है, तब तक यह दावा उपयुक्त नहीं होता है कि आप किस अपवादों को पकड़ते हैं।

इस दृष्टिकोण के साथ वास्तव में गलती की केवल एक चीज यह है कि बयान का उपयोग करके एक बहुत वर्णनात्मक अपवाद बनाना कठिन है। यदि आप सरल सिंटैक्स की तलाश कर रहे हैं तो याद रखें कि आप ऐसा कुछ भी कर सकते हैं:

 class XLessThanZeroException(Exception): pass def CheckX(x): if x < 0: raise XLessThanZeroException() def foo(x): CheckX(x) #do stuff here 

एक अन्य समस्या यह है कि सामान्य स्थिति जांच के लिए जोर देते हुए यह है कि डी-डिबगिंग को निष्क्रिय करना मुश्किल है-ओ ध्वज का उपयोग करके

जैसा कि पहले कहा गया है, जब आपका कोड कभी भी किसी बिंदु तक नहीं पहुंचता है, तो इसका इस्तेमाल किया जाना चाहिए, जिसका अर्थ है कि वहां एक बग है शायद सबसे उपयोगी कारण यह है कि मैं एक अभियुक्त का उपयोग करने के लिए देख सकता हूँ एक अपरिवर्तनीय / पूर्व / बाद की शर्त है ये ऐसी चीजें हैं जो किसी लूप या फ़ंक्शन के प्रत्येक आवृत्ति के प्रारंभ या अंत में सत्य होने चाहिए।

उदाहरण के लिए, एक रिकर्सिव फ़ंक्शन (2 अलग फ़ंक्शन हैं, इसलिए 1 खराब इनपुट को संभालता है और अन्य खराब कोड को संभालता है, क्योंकि यह रिकर्सन के साथ अंतर करना कठिन है)। इससे यह स्पष्ट होगा कि मैं अगर बयान लिखना भूल गया था, तो गलत क्या हुआ था।

 def SumToN(n): if n <= 0: raise ValueError, "N must be greater than or equal to 0" else: return RecursiveSum(n) def RecursiveSum(n): #precondition: n >= 0 assert(n >= 0) if n == 0: return 0 return RecursiveSum(n - 1) + n #postcondition: returned sum of 1 to n 

इन लूप अपूर्व्यों को अक्सर एक अभियुक्त के साथ प्रतिनिधित्व किया जा सकता है

के लिए के रूप में " वहाँ एक प्रदर्शन मुद्दा है ?":

  • कृपया "इसे काम करने से पहले इसे पहले काम करें " याद रखें
    किसी भी प्रोग्राम का बहुत कम प्रतिशत आमतौर पर इसकी गति के लिए प्रासंगिक है यदि आप कभी भी प्रदर्शन समस्या साबित करते assert तो आप हमेशा assert से लात या आसान बना सकते हैं – और उनमें से ज्यादातर कभी नहीं करेंगे

  • व्यावहारिक बनें:
    मान लें कि आपके पास एक ऐसी विधि है जो टपलेट की एक गैर रिक्त सूची को संसाधित करती है और प्रोग्राम लॉजिक टूट जाएगी अगर उन टुपे अपरिवर्तनीय नहीं हैं। आपको लिखना चाहिए:

     def mymethod(listOfTuples): assert(all(type(tp)==tuple for tp in listOfTuples)) 

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

     def mymethod(listOfTuples): assert(type(listOfTuples[0])==tuple) # in fact _all_ must be tuples! 

    यह सस्ता है, लेकिन वैसे भी वास्तविक कार्यक्रम त्रुटियों के 97% को पकड़ने की संभावना है।

आईडीटी में जैसे पीटीवीएस, पीएचचर्म, विंग assert isinstance() कुछ अस्पष्ट वस्तुओं के लिए कोड पूरा करने के लिए प्रयोग किया जा सकता है।

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

एक आशंका है जांच –
1. मान्य शर्त,
2. मान्य वक्तव्य,
3. सच तर्क;
स्रोत कोड का पूरी परियोजना को विफल करने के बजाय यह एक चेतावनी देता है कि आपकी स्रोत फ़ाइल में कुछ उपयुक्त नहीं है।

उदाहरण 1 में, चर 'str' के बाद से नल नहीं है तो कोई भी जोर या अपवाद नहीं उठाया।

उदाहरण 1:

 #!/usr/bin/python str = 'hello Pyhton!' strNull = 'string is Null' if __debug__: if not str: raise AssertionError(strNull) print str if __debug__: print 'FileName '.ljust(30,'.'),(__name__) print 'FilePath '.ljust(30,'.'),(__file__) ------------------------------------------------------ Output: hello Pyhton! FileName ..................... hello FilePath ..................... C:/Python\hello.py 

उदाहरण 2 में, var 'str' नल है इसलिए हम यूजर को दोषपूर्ण कार्यक्रम से आगे बढ़ने से बचाते हैं।

उदाहरण 2:

 #!/usr/bin/python str = '' strNull = 'NULL String' if __debug__: if not str: raise AssertionError(strNull) print str if __debug__: print 'FileName '.ljust(30,'.'),(__name__) print 'FilePath '.ljust(30,'.'),(__file__) ------------------------------------------------------ Output: AssertionError: NULL String 

वह क्षण जिसे हम डिबग नहीं करना चाहते हैं और स्रोत कोड में आरोपित मुद्दे का एहसास करते हैं। अनुकूलन ध्वज अक्षम करें

अजगर-ओ assertStatement.py
कुछ भी प्रिंट नहीं मिलेगा

अंग्रेजी भाषा का शब्द यहां पर जोर दिया गया है, शपथ लेने , प्रतिज्ञा , ऐवो के अर्थ में प्रयोग किया जाता है। इसका मतलब यह नहीं "चेक" या "होना चाहिए" इसका मतलब यह है कि आप एक सांकेतिक शब्दों में कहें के रूप में यहाँ एक शपथ कथन कर रहे हैं:

 # I solemnly swear that here I will tell the truth, the whole truth, # and nothing but the truth, under pains and penalties of perjury, so help me FSM assert answer == 42 

अगर कोड सही है, सिंगल इवेंट अपवित्रा , हार्डवेयर विफलताओं और ऐसे के अलावा, कोई जोर कभी विफल नहीं होगा । यही कारण है कि अंतिम उपयोगकर्ता के लिए कार्यक्रम का व्यवहार प्रभावित नहीं होना चाहिए। विशेष रूप से, असाधारण प्रोग्रामेटिक परिस्थितियों में भी एक जोर विफल नहीं हो सकता। यह सिर्फ कभी नहीं होता है अगर ऐसा होता है, तो प्रोग्रामर को इसके लिए ज़ेड होना चाहिए