2012-12-18 13 views
5

Belli bir dosyaya bakması gereken bir Python betiğim var.Birden çok olası dosya konumunu ele alma pythonic yolu? (Nested trys kullanmadan)

os.path.isafile() öğesini kullanabilirim, ancak bunun kötü Python olduğunu duydum, bu yüzden bunun yerine özel durumu yakalamaya çalışıyorum. Ancak, dosyayı arayabileceğimiz iki yer var. Bunu işlemek için iç içe trys kullanabilirsiniz:

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') 

Ya da sadece bir blok dışında ilk bir geçiş koyabilir ve daha sonra hemen altında bir tane daha vardır: Ancak

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') 

, orada bir daha Yukarıdaki durumla başa çıkmak için pythonic yolu? Eğer döngü için bir else maddeyi ekleyebilir

Ayrıca
+0

Neden bir döngü yazmıyorsunuz? -1 Döngü kavramını bilmemek için –

+4

Bu, daha pythonik bir yöntem istemek için mükemmel bir soru. Dönüp düşünmediği için onu düşünebileceğini sanmıyorum. –

cevap

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 

Alkış, Victor; Bu, bazı kod sadece döngü tükenme ile sona erdiğinde yürütülür (konumların hiçbiri geçerli değildir).

+0

'for' bloğuna' else: 'ifadesini, konumların hiçbirinin eşleşmediği hata mesajıyla ekleyebilirim. – eumiro

+0

@ eumiro - :) Sadece yazıyordum. İyi bir fikir. – root

+0

+1. Ayrıca, muhtemelen bunu bir try_to_connect_one_of (location) 'işlevinde (belki daha iyi bir isimle olsa da) sarmak isteyebilirsiniz. – abarnert

İlgili konular