2010-01-13 5 views
7

Trong Python 2.6 có thể để ngăn chặn cảnh báo từ các mô-đun cảnh báo bằng cách sử dụngcảnh báo Bắt pre-python 2,6

with warnings.catch_warnings(): 
    warnings.simplefilter("ignore") 
    fxn() 

Các phiên bản của Python trước 2,6 không hỗ trợ with Tuy nhiên, vì vậy tôi tự hỏi nếu có lựa chọn thay thế cho những điều trên sẽ làm việc với các phiên bản trước 2.6?

Trả lời

3

này cũng tương tự:

# Save the existing list of warning filters before we modify it using simplefilter(). 
# Note: the '[:]' causes a copy of the list to be created. Without it, original_filter 
# would alias the one and only 'real' list and then we'd have nothing to restore. 
original_filters = warnings.filters[:] 

# Ignore warnings. 
warnings.simplefilter("ignore") 

try: 
    # Execute the code that presumably causes the warnings. 
    fxn() 

finally: 
    # Restore the list of warning filters. 
    warnings.filters = original_filters 

Edit: Nếu không có sự try/finally, các bộ lọc cảnh báo ban đầu sẽ không được khôi phục nếu fxn() ném một ngoại lệ. Xem PEP 343 để thảo luận thêm về cách câu lệnh with phục vụ để thay thế try/finally khi được sử dụng như thế này.

+0

Cảm ơn! Bạn có thể giải thích làm thế nào và tại sao điều này hoạt động? – astrofrog

+0

Morgoth: Nó tạo một bản sao của bộ lọc, sửa đổi chúng, gọi fxn và cuối cùng đặt lại bộ lọc thành giá trị ban đầu. Điều khá giống với trình quản lý ngữ cảnh 2.6. –

+0

Cảm ơn bạn đã giải thích - tại sao thử lại ... cuối cùng là cần thiết? – astrofrog

-1

Tùy thuộc vào những gì các phiên bản tối thiểu bạn cần hỗ trợ sử dụng Python 2.5 của

from __future__ import with_statement 

có thể là một lựa chọn, nếu không có thể bạn sẽ cần phải dự phòng với những gì Jon gợi ý.

+3

Khi Pär Wieslander chỉ ra cho tôi khi tôi thử câu trả lời này (mà bây giờ tôi thấy tôi không nên xóa), 'catch_warnings()' đã được giới thiệu trong 2.6, vì vậy trong trường hợp này, chỉ cần có câu lệnh with không giúp (trừ khi bạn muốn sao chép việc thực thi 'catch_warnings()'. –