2013-06-19 20 views
20

Tôi khá mới để Python, đây là một số mã Tôi đang tìm kiếm tại địa chỉ:Sử dụng một biến trong một thử, đánh bắt, cuối cùng tuyên bố mà không tuyên bố nó ở bên ngoài

try: 
    connection = getConnection(database) 
    cursor = connection.cursor() 
    cursor.execute("some query") 
except: 
    log.error("Problem.") 
    raise 
finally: 
    cursor.close() 
    connection.close() 

Liệu rằng được làm sạch đúng cách? Trong các ngôn ngữ khác mà tôi đã viết trong, tôi đang sử dụng để làm một cái gì đó như thế này:

connection = None 
cursor = None 

try: 
    connection = getConnection(database) 
    cursor = connection.cursor() 
    cursor.execute("some query") 
except: 
    log.error("Problem.") 
    raise 
finally: 
    if cursor is not None: 
     cursor.close() 
    if connection is not None:  
     connection.close() 

Trả lời

35

Python không có phạm vi khối. Mọi thứ được xác định bên trong khối try sẽ có sẵn bên ngoài.

Điều đó nói rằng, bạn vẫn gặp sự cố: nếu đó là cuộc gọi getConnection() làm tăng lỗi, cursor sẽ không được xác định, do đó tham chiếu trong khối finally sẽ bị lỗi.

+2

Phải, tôi hy vọng điều này có ý nghĩa, nhưng "có sẵn bao xa" ? Tôi sẽ giả định rằng một hàm sẽ chứa nó, điều gì sẽ xảy ra nếu các câu lệnh và các vòng lặp? – Cheetah

+1

Nếu toàn bộ khối đó nằm trong một hàm, nó có sẵn từ đó cho đến khi kết thúc hàm. Nếu nó ở cấp mô-đun, nó có sẵn trên toàn cầu trong mô-đun đó. Nếu các câu lệnh và vòng lặp không đưa ra phạm vi mới. –

6

tôi muốn đề nghị sử dụng bối cảnh, như:

from contextlib import closing 

try: 
    with closing(getConnection(database)) as connection: 
     with closing(connection.cursor()) as cursor: 
      cursor.execute("some query") 
except: 
    log.error("Problem") 
    raise 

này phải đảm bảo đóng cửa (xem more here). Trong một số trường hợp, bạn thậm chí sẽ không cần closing vì kết nối có nhiều khả năng hỗ trợ chính giao thức ngữ cảnh, vì vậy sẽ chỉ là with getConnection(database)...

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