2012-12-18 5 views
5

Ho uno script Python che deve cercare un determinato file.Modo pititico di gestire più possibili percorsi di file? (Senza utilizzare trys nidificati)

Potrei usare os.path.isafile(), ma ho sentito che è cattivo Python, quindi sto cercando di catturare l'eccezione.

Tuttavia, ci sono due posizioni che potrei cercare il file. Potrei usare trys annidati per gestire questa situazione:

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

O potrei semplicemente mettere un passaggio nella prima eccezione di blocco, e poi hanno un altro appena sotto:

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

Tuttavia, c'è un altro Modo Pythonic per gestire la situazione di cui sopra?

Cheers, Victor

+0

Perché non scrivi un ciclo? -1 per non conoscere il concetto di un ciclo –

+4

È una domanda perfettamente valida che richiede un metodo più pitioso per farlo. Non penso davvero che puoi dingerlo per non pensare al loop. –

risposta

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 

Inoltre è possibile aggiungere una clausola else per il ciclo for; questo è un codice che viene eseguito solo se il ciclo termina per esaurimento (nessuna delle posizioni è valida).

+0

Vorrei aggiungere 'else:' al blocco 'for' con il messaggio di errore che nessuna delle posizioni corrispondeva. – eumiro

+0

@ eumiro - :) Stavo solo scrivendo. buona idea. – root

+0

+1. Inoltre, probabilmente vorrai racchiuderlo in una funzione 'try_to_connect_one_of (locations)' (anche se forse con un nome migliore ...). – abarnert

Problemi correlati