2014-07-08 5 views
9

मैं वेबपृष्ठों से कुछ जानकारी स्क्रैप करने की कोशिश कर रहा हूं जो जानकारी कहां स्थित है, इस बारे में असंगत हैं। मुझे कई संभावनाओं को संभालने के लिए कोड मिला है; मैं चाहता हूं कि उन्हें अनुक्रम में आज़माएं, फिर यदि उनमें से कोई भी काम नहीं करता है तो मैं कृपापूर्वक विफल होना चाहता हूं और आगे बढ़ना चाहता हूं।पायथन कोशिश/छोड़कर: कई विकल्पों को आजमाने की कोशिश

यही है, छद्म-कोड में:

try: 
    info = look_in_first_place() 
otherwise try: 
    info = look in_second_place() 
otherwise try: 
    info = look_in_third_place() 
except AttributeError: 
    info = "Info not found" 

मैं नेस्टेड कोशिश बयानों के साथ ऐसा कर सकता है, लेकिन अगर मैं 15 संभावनाओं की जरूरत है तो कोशिश करने के लिए मैं खरोज के 15 स्तरों की आवश्यकता होगी!

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

संपादित करें: जैसा कि जॉन का (बहुत अच्छा) समाधान नीचे उठता है, ब्रेवटी के लिए मैंने प्रत्येक लुकअप कॉल को एक फंक्शन कॉल के रूप में लिखा है, जबकि वास्तव में यह आमतौर पर soup.find('h1', class_='parselikeHeader') जैसे सुंदर सूप कॉल का एक छोटा ब्लॉक है। निस्संदेह मैं इन कार्यों को लपेट सकता हूं, लेकिन ऐसा लगता है कि इस तरह के सरल ब्लॉक के साथ थोड़ा सा सुरुचिपूर्ण लगता है - अगर माफी माँगती है तो मेरी शॉर्टेंड समस्या को बदल देती है। प्रत्येक देखने के लिए एक अलग समारोह है

try: 
    info = soup.find('h1', class_='parselikeHeader').get('href') 
if that fails try: 
    marker = soup.find('span', class_='header') 
    info = '_'.join(marker.stripped_strings) 
if that fails try: 
    (other options) 
except AttributeError: 
    info = "Info not found" 
+0

कारण है कि आप की क्या ज़रूरत है एक कोशिश/छोड़कर, वृत्ति करने के लिए उपयोग करता है, तो किसी और elif –

+0

धन्यवाद Padraic, लेकिन इसके अलावा में LYBL से अधिक EAFP के पक्ष में, मुझे यकीन है कि मैं अगर भविष्यवाणी करने के लिए सक्षम होगा नहीं कर रहा हूँ की स्थिति जांच के लिए क्योंकि यह कई अलग-अलग तरीकों से गलत हो सकता है, इसलिए एक बाध्य लेकिन व्यापक अपवादों को संभालने से प्राकृतिक फिट लग रहा था। – user3816044

+0

खोज खाली हो जाएगा यदि यह किसी भी चीज़ से मेल नहीं खाता है तो ... यदि कोई मैच है तो केवल तभी सच होगा यदि एलिफ अन्य काम करेगा। आप सभी पैटर्न को एक सूची में डाल सकते हैं और यदि चेक का उपयोग कर उस पर लूप लगा सकते हैं और एक और यदि कोई भी –

उत्तर

8

हैं, तो आप किसी सूची में सभी कार्यों स्टोर कर सकते हैं और फिर एक के बाद एक उन पर पुनरावृति:

यह एक अधिक उपयोगी उदाहरण हो सकता है।

lookups = [ 
    look_in_first_place, 
    look_in_second_place, 
    look_in_third_place 
] 

info = None 

for lookup in lookups: 
    try: 
     info = lookup() 
     # exit the loop on success 
     break  
    except AttributeError: 
     # repeat the loop on failure 
     continue 

# when the loop is finished, check if we found a result or not 
if info: 
    # success 
else: 
    # failure 
+0

मुझे ऐसा लगता है, लेकिन फिलहाल लुकअप कोड वास्तव में अलग-अलग कार्यों में नहीं है लेकिन आमतौर पर सुंदर सूप कॉल की 2-3 पंक्तियां होती है। मुझे लगता है कि मैं सभी संभावनाओं के लिए रैपर लिख सकता हूं, लेकिन यह ओवरकिल जैसा लगता है क्योंकि मैं जानकारी के कई बिट्स की जांच कर रहा हूं, जिनमें से प्रत्येक को कई कोशिशों को देखने की कोशिश हो सकती है ... सूची रणनीति बहुत पाइथनिक प्रतीत होती है हालांकि मैं इसका उपयोग कर सकता हूं अगर मैं बेहतर समाधान नहीं करता हूं। – user3816044

+0

इसके बारे में भी सोचा, इस तरह से ऐसा करने का मतलब यह होगा कि बाद के कार्य केवल तब उपयोगी हो सकते हैं जब विशेष आदेश में कहा जाता है कि सूची निर्दिष्ट करती है (यदि, उदाहरण के लिए, मैं प्रत्येक क्रमिक प्रयास को अधिक अनुमोदित करना चाहता हूं)। खराब डेटा उत्पन्न करने के आसपास झूठ बोलने वाले कार्यों को तब तक जब तक कि किसी अन्य कार्य के ठीक बाद उपयोग नहीं किया जाता है, ऐसा लगता है कि यह एक खतरनाक encapsulation रणनीति हो सकती है? – user3816044

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