2012-12-18 21 views
5

Tôi có một tập lệnh Python cần tìm một tập tin nhất định.Cách Pythonic xử lý nhiều vị trí tệp có thể? (Nếu không sử dụng trys lồng nhau)

Tôi có thể sử dụng os.path.isafile(), nhưng tôi đã nghe nói đó là Python xấu, vì vậy tôi đang cố gắng nắm bắt ngoại lệ.

Tuy nhiên, có hai vị trí mà tôi có thể tìm kiếm tệp. Tôi có thể sử dụng trys lồng nhau để xử lý này:

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

Hoặc tôi có thể chỉ cần đặt một đường chuyền trong lần đầu tiên ngoại trừ khối, và sau đó có một khác chỉ dưới đây:

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

Tuy nhiên, có một chi tiết Pythonic cách để xử lý tình hình trên?

Chúc mừng, Victor

+0

Tại sao bạn không viết vòng lặp? -1 vì không biết khái niệm về một vòng lặp –

+4

Đó là một câu hỏi hoàn toàn hợp lệ yêu cầu một phương pháp pythonic hơn làm như vậy. Tôi không thực sự nghĩ rằng bạn có thể ding anh ta không nghĩ đến looping. –

Trả lời

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 

Ngoài ra bạn có thể thêm một khoản else đến cho vòng lặp; đó là một số mã được thực thi chỉ khi vòng lặp kết thúc thông qua sự cạn kiệt (không có vị trí nào hợp lệ).

+0

Tôi sẽ thêm 'else:' vào khối 'for' với thông báo lỗi rằng không có vị trí nào phù hợp. – eumiro

+0

@ eumiro - :) Tôi vừa viết xuống. ý tưởng tốt. – root

+0

+1. Ngoài ra, bạn có thể muốn bọc nó trong một hàm 'try_to_connect_one_of (locations)' (mặc dù có thể với một tên tốt hơn ...). – abarnert

Các vấn đề liên quan