पायथन में ईएएफपी सिद्धांत क्या है?


जवाबों:


215

से शब्दकोष :

अनुमति की तुलना में क्षमा मांगना आसान है। यह सामान्य पायथन कोडिंग शैली वैध कुंजी या विशेषताओं के अस्तित्व को मानती है और यदि अपवाद गलत साबित होता है तो अपवादों को पकड़ता है। यह साफ और तेज शैली कई tryऔर exceptबयानों की उपस्थिति की विशेषता है । तकनीक LBYL शैली के साथ कई अन्य भाषाओं जैसे कि C के विपरीत है ।

एक उदाहरण एक शब्दकोश कुंजी तक पहुंचने का प्रयास होगा।

EAFP:

try:
    x = my_dict["key"]
except KeyError:
    # handle missing key

LBYL:

if "key" in my_dict:
    x = my_dict["key"]
else:
    # handle missing key

LBYL संस्करण को दो बार शब्दकोश के अंदर कुंजी की खोज करनी है, और इसे थोड़ा कम पठनीय भी माना जा सकता है।


34
एक वृद्धि यह होगी कि एक और लाभ दौड़ की स्थिति से बचने का है ... उदाहरण के लिए, बस एक फ़ाइल खोलने का प्रयास करें और यदि आप इसे प्राप्त करते हैं, तो आपको यह मिल गया। यह देखने के बजाय कि क्या आप इसे प्राप्त कर सकते हैं , तो इसे बाद में प्राप्त करने का प्रयास करें और महसूस करें कि चेक और एक्सेस अटैच के बीच की न्यूनतम राशि में, आप इसे प्राप्त कर सकते हैं।
जॉन क्लेमेंट्स

23
पायथन उन दोनों से बचने का एक तरीका भी प्रदान करता है, यदि हैंडलर बस डिफ़ॉल्ट मान असाइन कर रहा है xजब कुंजी मौजूद नहीं है: यदि नहीं है तो x = mydict.get('key')वापस आ जाएगा ; आप भी कर सकते हैं , और फिर x को कुछ सौंपा जाएगा यदि कुंजी शब्दकोश में नहीं है। और अतिरिक्त कोड से बचने के लिए अच्छी चीजें हैं। None'key'my_dict.get('key', <something>)dict.setdefault()collections.defaultdict
JAB

1
मुझे लगता है कि except KeyErrorके साथ-साथ AttributeErrorसरल लेकिन सबसे खराब उदाहरण हैं। इसलिए कई बार मैं कुछ डिबगिंग में फंस गया क्योंकि except AttributeErrorगलत जगह डाल दिया गया था, जो अंत में गलत विशेषता त्रुटि को पकड़ रहा था जो श्रृंखला में गहराई से बढ़ा। मुझे लगता है कि बेहतर उदाहरण हैं try: open() ... except: IOError:। याtry: parseLine() ... except ParseError
स्की

4
@स्की यह थोड़ी अलग समस्या है। गलत अपवाद को पकड़ने से बचने के लिए आपको हमेशा जितना संभव हो कोशिश ब्लॉक रखना चाहिए । यह भी ध्यान दें कि मैं आम तौर पर ईएएफपी शैली को पसंद नहीं करता हूं। मैं यहां केवल इस सवाल का जवाब दे रहा हूं, और बता रहा हूं कि कुछ लोग इसे पसंद करते हैं। मैं केस-दर-मामला इस आधार पर डिसाइड करता हूं कि मुझे कौन सा कोड सबसे ज्यादा पठनीय लगता है।
स्वेन मार्नाच

1
मुझे लगा कि यह ध्यान देने योग्य होगा कि ग्रेस हॉपर इस वाक्यांश के लिए संभवतः स्रोत है, उसकी बोली के साथ: "हिम्मत और करो। अनुमति प्राप्त करने की तुलना में माफी माँगना आसान है" (प्रोग्रामिंग तक सीमित नहीं)।
फेबियन सन्नुअर्ट

9

मैं इसे दूसरे उदाहरण से समझाने की कोशिश करूँगा।

यहां हम फ़ाइल तक पहुंचने और कंसोल में सामग्री प्रिंट करने का प्रयास कर रहे हैं।

LBYL - इससे पहले कि आप लीप देखें:

हम जाँच सकते हैं कि क्या हम फ़ाइल तक पहुँच सकते हैं और यदि हम कर सकते हैं, तो हम इसे खोलेंगे और सामग्री प्रिंट करेंगे। यदि हम उस फ़ाइल तक नहीं पहुँच सकते हैं जो हम elseभाग को मारेंगे। कारण यह है कि यह एक दौड़ की स्थिति है क्योंकि हम पहले एक एक्सेस-चेक बनाते हैं। जब तक हम पहुंचते हैं, तब तक with open(my_file) as f:हम कुछ अनुमति के मुद्दों के कारण इसे एक्सेस नहीं कर सकते हैं (उदाहरण के लिए एक अन्य प्रक्रिया एक अनन्य फ़ाइल लॉक प्राप्त करती है)। यह कोड संभवतः एक त्रुटि फेंक देगा और हम उस त्रुटि को नहीं पकड़ पाएंगे क्योंकि हमने सोचा था कि हम फ़ाइल तक पहुंच सकते हैं।

import os

my_file = "/path/to/my/file.txt"

# Race condition
if os.access(my_file, os.R_OK):
    with open(my_file) as f:
        print(f.read())
else:
    print("File can't be accessed")

EAFP - अनुमति की तुलना में माफी के लिए पूछना आसान:

इस उदाहरण में, हम केवल फ़ाइल को खोलने का प्रयास कर रहे हैं और यदि हम इसे नहीं खोल सकते हैं, तो यह एक फेंक देगा IOError। यदि हम कर सकते हैं, तो हम फ़ाइल खोलेंगे और सामग्री प्रिंट करेंगे। इसलिए कुछ पूछने के बजाय हम इसे करने की कोशिश कर रहे हैं । अगर यह काम करता है, महान! यदि यह नहीं होता है तो हम त्रुटि को पकड़ लेते हैं और उसे संभाल लेते हैं।

# # No race condition
try:
    f = open(my_file)
except IOError as e:
    print("File can't be accessed")
else:
    with f:
        print(f.read())

मुझे यकीन नहीं है कि यह एक दौड़ की स्थिति के रूप में वर्णन करना सही है। या तो फ़ाइल सुलभ है या नहीं।
ds4940

3
@ ds4940 यह दौड़ की स्थिति है यदि फ़ाइल एक्सेसिबिलिटी लाइनों 6 और 7 के बीच बदलती है, तो यह जाँचने के बीच है कि क्या फ़ाइल सुलभ है और इसे खोल रही है।
मार्कस वॉन ब्रॉडी

@MarkusvonBroady ने सहमति व्यक्त की, दौड़ की स्थिति में अन्य प्रतिभागी का उदाहरण प्रदान करने के लिए उत्तर को संपादित किया।
ds4940

6

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

मेरी भावना यह है कि यदि कोई उपयोगकर्ता गलतियाँ करने जा रहा है, तो उन्हें समय के परिणाम भुगतने चाहिए। जो लोग उपकरण का सही तरीके से उपयोग करते हैं, उनके माध्यम से किया जाता है।

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