2012-12-18 14 views
5

मेरे पास एक पायथन स्क्रिप्ट है जिसे किसी निश्चित फ़ाइल को देखने की आवश्यकता है।एकाधिक संभावित फ़ाइल स्थानों को संभालने का पाइथोनिक तरीका? (नेस्टेड trys का उपयोग किए बिना)

मैं os.path.isafile() का उपयोग कर सकता हूं, लेकिन मैंने सुना है कि यह खराब पायथन है, इसलिए मैं इसके बजाय अपवाद को पकड़ने की कोशिश कर रहा हूं।

हालांकि, दो स्थानों पर मैं संभवतः फ़ाइल की तलाश कर सकता हूं। मैं इस संभाल करने के लिए नेस्टेड trys इस्तेमाल कर सकते हैं:

try: 
    keyfile = 'location1' 
    try_to_connect(keyfile) 
except IOError: 
    try: 
     keyfile = 'location2' 
     try_to_connect(keyfile) 
    except: 
     logger.error('Keyfile not found at either location1 or location2') 

या मैं बस ब्लॉक को छोड़कर पहले में एक पास डाल सकता है, और फिर बस नीचे एक और एक है:

try: 
    keyfile = 'location1' 
    try_to_connect(keyfile) 
except IOError: 
    pass 
try: 
    keyfile = 'location2' 
    try_to_connect(keyfile) 
except: 
    logger.error('Keyfile not found at either location1 or location2') 

हालांकि, वहाँ एक और अधिक है उपरोक्त स्थिति को संभालने के लिए पाइथोनिक तरीका?

चीयर्स, विक्टर

+0

आप लूप क्यों नहीं लिखते? -1 लूप –

+4

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

उत्तर

10
for location in locations: 
    try: 
     try_to_connect(location) 
     break 
    except IOError: 
     continue 
else: 
    # this else is optional 
    # executes some code if none of the locations is valid 
    # for example raise an Error as suggested @eumiro 

इसके अलावा, आप पाश के लिए के लिए एक else खंड जोड़ सकते हैं; यह कुछ कोड केवल तभी निष्पादित किया जाता है जब लूप थकावट के माध्यम से समाप्त हो जाता है (कोई भी स्थान मान्य नहीं है)।

+0

मैं 'else' 'को 'संदेश' के साथ त्रुटि संदेश के साथ जोड़ दूंगा जिसमें से कोई भी मिलान मेल नहीं खाता है। – eumiro

+0

@ eumiro - :) मैं बस इसे लिख रहा था। अच्छा विचार। – root

+0

+1। इसके अलावा, आप शायद इस (एक बेहतर नाम के साथ हालांकि शायद ...) एक समारोह 'try_to_connect_one_of (स्थानों) में लपेट के लिए' चाहते हैं। – abarnert